[LL FIR] fix status resolution of static enum members

Before, BODY_RESOLVE phase were used for them but status may be unresolved.
This caused CCE on accessing resolved status for such static enum members.

Now, those declarations are created with the status of owning enum as the status is taken from that class.
This commit is contained in:
Ilya Kirillov
2022-11-15 18:59:41 +01:00
committed by teamcity
parent 84650d08af
commit 8dab560d6e
4 changed files with 56 additions and 53 deletions
@@ -21,6 +21,6 @@ FILE: enum.kt
}
public final static [BODY_RESOLVE] val entries: R|kotlin/enums/EnumEntries<Enum>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<Enum>|
public [BODY_RESOLVE] get(): R|kotlin/enums/EnumEntries<Enum>|
}
@@ -7,13 +7,13 @@ FILE: annotationParameters.kt
}
public final static [RAW_FIR] [ContainingClassKey=X] enum entry A: R|X|
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
public final static [RAW_FIR] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun valueOf([BODY_RESOLVE] value: R|kotlin/String|): R|X| {
public final static [RAW_FIR] [ContainingClassKey=X] fun valueOf([RAW_FIR] value: R|kotlin/String|): R|X| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public final static [RAW_FIR] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>|
}
@@ -45,13 +45,13 @@ FILE: annotationParameters.kt
}
public final static [RAW_FIR] [ContainingClassKey=X] enum entry A: R|X|
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
public final static [RAW_FIR] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun valueOf([BODY_RESOLVE] value: R|kotlin/String|): R|X| {
public final static [RAW_FIR] [ContainingClassKey=X] fun valueOf([RAW_FIR] value: R|kotlin/String|): R|X| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public final static [RAW_FIR] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>|
}
@@ -83,13 +83,13 @@ FILE: annotationParameters.kt
}
public final static [RAW_FIR] [ContainingClassKey=X] enum entry A: R|X|
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
public final static [RAW_FIR] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun valueOf([BODY_RESOLVE] value: R|kotlin/String|): R|X| {
public final static [RAW_FIR] [ContainingClassKey=X] fun valueOf([RAW_FIR] value: R|kotlin/String|): R|X| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public final static [RAW_FIR] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>|
}
@@ -121,13 +121,13 @@ FILE: annotationParameters.kt
}
public final static [RAW_FIR] [ContainingClassKey=X] enum entry A: R|X|
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
public final static [RAW_FIR] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun valueOf([BODY_RESOLVE] value: R|kotlin/String|): R|X| {
public final static [RAW_FIR] [ContainingClassKey=X] fun valueOf([RAW_FIR] value: R|kotlin/String|): R|X| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public final static [RAW_FIR] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>|
}
@@ -159,13 +159,13 @@ FILE: annotationParameters.kt
}
public final static [RAW_FIR] [ContainingClassKey=X] enum entry A: R|X|
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
public final static [RAW_FIR] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun valueOf([BODY_RESOLVE] value: R|kotlin/String|): R|X| {
public final static [RAW_FIR] [ContainingClassKey=X] fun valueOf([RAW_FIR] value: R|kotlin/String|): R|X| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public final static [RAW_FIR] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>|
}
@@ -197,13 +197,13 @@ FILE: annotationParameters.kt
}
public final static [RAW_FIR] [ContainingClassKey=X] enum entry A: R|X|
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
public final static [RAW_FIR] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun valueOf([BODY_RESOLVE] value: R|kotlin/String|): R|X| {
public final static [RAW_FIR] [ContainingClassKey=X] fun valueOf([RAW_FIR] value: R|kotlin/String|): R|X| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public final static [RAW_FIR] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>|
}
@@ -235,13 +235,13 @@ FILE: annotationParameters.kt
}
public final static [RAW_FIR] [ContainingClassKey=X] enum entry A: R|X|
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
public final static [RAW_FIR] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun valueOf([BODY_RESOLVE] value: R|kotlin/String|): R|X| {
public final static [RAW_FIR] [ContainingClassKey=X] fun valueOf([RAW_FIR] value: R|kotlin/String|): R|X| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public final static [RAW_FIR] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>|
}
@@ -273,14 +273,14 @@ FILE: annotationParameters.kt
}
public final static [STATUS] [ContainingClassKey=X] enum entry A: R|X|
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
public final static [STATUS] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun valueOf([BODY_RESOLVE] value: R|kotlin/String|): R|X| {
public final static [STATUS] [ContainingClassKey=X] fun valueOf([STATUS] value: R|kotlin/String|): R|X| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>|
public final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [STATUS] get(): R|kotlin/enums/EnumEntries<X>|
}
public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| {
@@ -311,14 +311,14 @@ FILE: annotationParameters.kt
}
public final static [STATUS] [ContainingClassKey=X] enum entry A: R|X|
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
public final static [STATUS] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun valueOf([BODY_RESOLVE] value: R|kotlin/String|): R|X| {
public final static [STATUS] [ContainingClassKey=X] fun valueOf([STATUS] value: R|kotlin/String|): R|X| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>|
public final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [STATUS] get(): R|kotlin/enums/EnumEntries<X>|
}
public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| {
@@ -350,14 +350,14 @@ FILE: annotationParameters.kt
}
public final static [STATUS] [ContainingClassKey=X] enum entry A: R|X|
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
public final static [STATUS] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun valueOf([BODY_RESOLVE] value: R|kotlin/String|): R|X| {
public final static [STATUS] [ContainingClassKey=X] fun valueOf([STATUS] value: R|kotlin/String|): R|X| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>|
public final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [STATUS] get(): R|kotlin/enums/EnumEntries<X>|
}
public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| {
@@ -389,14 +389,14 @@ FILE: annotationParameters.kt
}
public final static [STATUS] [ContainingClassKey=X] enum entry A: R|X|
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
public final static [STATUS] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun valueOf([BODY_RESOLVE] value: R|kotlin/String|): R|X| {
public final static [STATUS] [ContainingClassKey=X] fun valueOf([STATUS] value: R|kotlin/String|): R|X| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>|
public final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [STATUS] get(): R|kotlin/enums/EnumEntries<X>|
}
public final [SUPER_TYPES] annotation class Anno : R|kotlin/Annotation| {
@@ -428,14 +428,14 @@ FILE: annotationParameters.kt
}
public final static [STATUS] [ContainingClassKey=X] enum entry A: R|X|
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
public final static [STATUS] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun valueOf([BODY_RESOLVE] value: R|kotlin/String|): R|X| {
public final static [STATUS] [ContainingClassKey=X] fun valueOf([STATUS] value: R|kotlin/String|): R|X| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>|
public final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [STATUS] get(): R|kotlin/enums/EnumEntries<X>|
}
public final [SUPER_TYPES] annotation class Anno : R|kotlin/Annotation| {
@@ -467,14 +467,14 @@ FILE: annotationParameters.kt
}
public final static [STATUS] [ContainingClassKey=X] enum entry A: R|X|
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
public final static [STATUS] [ContainingClassKey=X] fun values(): R|kotlin/Array<X>| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] fun valueOf([BODY_RESOLVE] value: R|kotlin/String|): R|X| {
public final static [STATUS] [ContainingClassKey=X] fun valueOf([STATUS] value: R|kotlin/String|): R|X| {
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>|
public final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [STATUS] get(): R|kotlin/enums/EnumEntries<X>|
}
public final [SUPER_TYPES] annotation class Anno : R|kotlin/Annotation| {
@@ -513,7 +513,7 @@ FILE: annotationParameters.kt
}
public final static [BODY_RESOLVE] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>|
public [BODY_RESOLVE] get(): R|kotlin/enums/EnumEntries<X>|
}
public final [BODY_RESOLVE] annotation class Anno : R|kotlin/Annotation| {
@@ -245,6 +245,7 @@ abstract class FirJavaFacade(
val classIsAnnotation = javaClass.classKind == ClassKind.ANNOTATION_CLASS
val moduleData = getModuleDataForClass(javaClass)
return buildJavaClass {
resolvePhase = FirResolvePhase.BODY_RESOLVE
source = javaClass.toSourceElement()
this.moduleData = moduleData
symbol = classSymbol
@@ -15,8 +15,10 @@ 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.*
import org.jetbrains.kotlin.fir.declarations.builder.FirRegularClassBuilder
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
@@ -55,7 +57,7 @@ fun FirRegularClassBuilder.generateValuesFunction(
isExpect = makeExpect
}
symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, ENUM_VALUES))
resolvePhase = FirResolvePhase.BODY_RESOLVE
resolvePhase = this@generateValuesFunction.resolvePhase
body = buildEmptyExpressionBlock().also {
it.replaceTypeRef(returnTypeRef)
}
@@ -104,9 +106,9 @@ fun FirRegularClassBuilder.generateValueOfFunction(
isCrossinline = false
isNoinline = false
isVararg = false
resolvePhase = FirResolvePhase.BODY_RESOLVE
resolvePhase = this@generateValueOfFunction.resolvePhase
}
resolvePhase = FirResolvePhase.BODY_RESOLVE
resolvePhase = this@generateValueOfFunction.resolvePhase
body = buildEmptyExpressionBlock().also {
it.replaceTypeRef(returnTypeRef)
}
@@ -141,7 +143,7 @@ fun FirRegularClassBuilder.generateEntriesGetter(
isExpect = makeExpect
}
symbol = FirPropertySymbol(CallableId(packageFqName, classFqName, ENUM_ENTRIES))
resolvePhase = FirResolvePhase.BODY_RESOLVE
resolvePhase = this@generateEntriesGetter.resolvePhase
getter = FirDefaultPropertyGetter(
sourceElement?.fakeElement(KtFakeSourceElementKind.EnumGeneratedDeclaration),
moduleData, FirDeclarationOrigin.Source, returnTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.EnumGeneratedDeclaration),