[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 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 [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>| 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 [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>| 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 [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>| 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 [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>| 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 [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>| 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 [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>| 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 [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>| 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 [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 final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>| public [STATUS] get(): R|kotlin/enums/EnumEntries<X>|
} }
public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| { 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 [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 final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>| public [STATUS] get(): R|kotlin/enums/EnumEntries<X>|
} }
public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| { 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 [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 final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>| public [STATUS] get(): R|kotlin/enums/EnumEntries<X>|
} }
public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| { 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 [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 final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>| public [STATUS] get(): R|kotlin/enums/EnumEntries<X>|
} }
public final [SUPER_TYPES] annotation class Anno : R|kotlin/Annotation| { 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 [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 final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>| public [STATUS] get(): R|kotlin/enums/EnumEntries<X>|
} }
public final [SUPER_TYPES] annotation class Anno : R|kotlin/Annotation| { 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 [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 final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries<X>|
public [RAW_FIR] get(): R|kotlin/enums/EnumEntries<X>| public [STATUS] get(): R|kotlin/enums/EnumEntries<X>|
} }
public final [SUPER_TYPES] annotation class Anno : R|kotlin/Annotation| { 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 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| { 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 classIsAnnotation = javaClass.classKind == ClassKind.ANNOTATION_CLASS
val moduleData = getModuleDataForClass(javaClass) val moduleData = getModuleDataForClass(javaClass)
return buildJavaClass { return buildJavaClass {
resolvePhase = FirResolvePhase.BODY_RESOLVE
source = javaClass.toSourceElement() source = javaClass.toSourceElement()
this.moduleData = moduleData this.moduleData = moduleData
symbol = classSymbol symbol = classSymbol
@@ -15,8 +15,10 @@ import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fakeElement import org.jetbrains.kotlin.fakeElement
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus 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.* 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.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
@@ -55,7 +57,7 @@ fun FirRegularClassBuilder.generateValuesFunction(
isExpect = makeExpect isExpect = makeExpect
} }
symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, ENUM_VALUES)) symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, ENUM_VALUES))
resolvePhase = FirResolvePhase.BODY_RESOLVE resolvePhase = this@generateValuesFunction.resolvePhase
body = buildEmptyExpressionBlock().also { body = buildEmptyExpressionBlock().also {
it.replaceTypeRef(returnTypeRef) it.replaceTypeRef(returnTypeRef)
} }
@@ -104,9 +106,9 @@ fun FirRegularClassBuilder.generateValueOfFunction(
isCrossinline = false isCrossinline = false
isNoinline = false isNoinline = false
isVararg = false isVararg = false
resolvePhase = FirResolvePhase.BODY_RESOLVE resolvePhase = this@generateValueOfFunction.resolvePhase
} }
resolvePhase = FirResolvePhase.BODY_RESOLVE resolvePhase = this@generateValueOfFunction.resolvePhase
body = buildEmptyExpressionBlock().also { body = buildEmptyExpressionBlock().also {
it.replaceTypeRef(returnTypeRef) it.replaceTypeRef(returnTypeRef)
} }
@@ -141,7 +143,7 @@ fun FirRegularClassBuilder.generateEntriesGetter(
isExpect = makeExpect isExpect = makeExpect
} }
symbol = FirPropertySymbol(CallableId(packageFqName, classFqName, ENUM_ENTRIES)) symbol = FirPropertySymbol(CallableId(packageFqName, classFqName, ENUM_ENTRIES))
resolvePhase = FirResolvePhase.BODY_RESOLVE resolvePhase = this@generateEntriesGetter.resolvePhase
getter = FirDefaultPropertyGetter( getter = FirDefaultPropertyGetter(
sourceElement?.fakeElement(KtFakeSourceElementKind.EnumGeneratedDeclaration), sourceElement?.fakeElement(KtFakeSourceElementKind.EnumGeneratedDeclaration),
moduleData, FirDeclarationOrigin.Source, returnTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.EnumGeneratedDeclaration), moduleData, FirDeclarationOrigin.Source, returnTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.EnumGeneratedDeclaration),