From 8dab560d6ecc808e502159732e7e4da2ff664163 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 15 Nov 2022 18:59:41 +0100 Subject: [PATCH] [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. --- .../innerDeclarationsResolve/enum.fir.txt | 2 +- .../lazyResolve/annotationParameters.txt | 92 +++++++++---------- .../kotlin/fir/java/FirJavaFacade.kt | 1 + .../jetbrains/kotlin/fir/EnumClassUtils.kt | 14 +-- 4 files changed, 56 insertions(+), 53 deletions(-) diff --git a/analysis/low-level-api-fir/testdata/innerDeclarationsResolve/enum.fir.txt b/analysis/low-level-api-fir/testdata/innerDeclarationsResolve/enum.fir.txt index 76e0c5910bf..76aebf6029f 100644 --- a/analysis/low-level-api-fir/testdata/innerDeclarationsResolve/enum.fir.txt +++ b/analysis/low-level-api-fir/testdata/innerDeclarationsResolve/enum.fir.txt @@ -21,6 +21,6 @@ FILE: enum.kt } public final static [BODY_RESOLVE] val entries: R|kotlin/enums/EnumEntries| - public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| + public [BODY_RESOLVE] get(): R|kotlin/enums/EnumEntries| } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/annotationParameters.txt b/analysis/low-level-api-fir/testdata/lazyResolve/annotationParameters.txt index cc85e3f1375..6ae721d8e79 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/annotationParameters.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/annotationParameters.txt @@ -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| { + public final static [RAW_FIR] [ContainingClassKey=X] fun values(): R|kotlin/Array| { } - 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| + public final static [RAW_FIR] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries| public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| } @@ -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| { + public final static [RAW_FIR] [ContainingClassKey=X] fun values(): R|kotlin/Array| { } - 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| + public final static [RAW_FIR] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries| public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| } @@ -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| { + public final static [RAW_FIR] [ContainingClassKey=X] fun values(): R|kotlin/Array| { } - 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| + public final static [RAW_FIR] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries| public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| } @@ -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| { + public final static [RAW_FIR] [ContainingClassKey=X] fun values(): R|kotlin/Array| { } - 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| + public final static [RAW_FIR] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries| public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| } @@ -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| { + public final static [RAW_FIR] [ContainingClassKey=X] fun values(): R|kotlin/Array| { } - 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| + public final static [RAW_FIR] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries| public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| } @@ -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| { + public final static [RAW_FIR] [ContainingClassKey=X] fun values(): R|kotlin/Array| { } - 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| + public final static [RAW_FIR] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries| public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| } @@ -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| { + public final static [RAW_FIR] [ContainingClassKey=X] fun values(): R|kotlin/Array| { } - 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| + public final static [RAW_FIR] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries| public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| } @@ -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| { + public final static [STATUS] [ContainingClassKey=X] fun values(): R|kotlin/Array| { } - 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| - public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| + public final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries| + public [STATUS] get(): R|kotlin/enums/EnumEntries| } 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| { + public final static [STATUS] [ContainingClassKey=X] fun values(): R|kotlin/Array| { } - 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| - public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| + public final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries| + public [STATUS] get(): R|kotlin/enums/EnumEntries| } 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| { + public final static [STATUS] [ContainingClassKey=X] fun values(): R|kotlin/Array| { } - 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| - public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| + public final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries| + public [STATUS] get(): R|kotlin/enums/EnumEntries| } 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| { + public final static [STATUS] [ContainingClassKey=X] fun values(): R|kotlin/Array| { } - 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| - public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| + public final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries| + public [STATUS] get(): R|kotlin/enums/EnumEntries| } 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| { + public final static [STATUS] [ContainingClassKey=X] fun values(): R|kotlin/Array| { } - 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| - public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| + public final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries| + public [STATUS] get(): R|kotlin/enums/EnumEntries| } 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| { + public final static [STATUS] [ContainingClassKey=X] fun values(): R|kotlin/Array| { } - 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| - public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| + public final static [STATUS] [ContainingClassKey=X] val entries: R|kotlin/enums/EnumEntries| + public [STATUS] get(): R|kotlin/enums/EnumEntries| } 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| - public [RAW_FIR] get(): R|kotlin/enums/EnumEntries| + public [BODY_RESOLVE] get(): R|kotlin/enums/EnumEntries| } public final [BODY_RESOLVE] annotation class Anno : R|kotlin/Annotation| { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt index 62cf9244dc2..e258f39bb2f 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt @@ -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 diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt index 52f49c8033b..ce3588baca5 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt @@ -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),