From 0d279dd652c35e82e1819a8bbdd5aa89b3ae580c Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Thu, 14 Sep 2023 11:34:56 +0200 Subject: [PATCH] [FIR] Fix false negative JVM_STATIC_ON_CONST_OR_JVM_FIELD ... in presence of typealias. #KT-61921 --- .../declaration/FirJvmStaticChecker.kt | 15 ++++++----- .../jvmStatic/constOrJvmFieldProperty.kt | 8 ++++++ .../jvmStatic/constOrJvmFieldProperty.txt | 26 ------------------- 3 files changed, 16 insertions(+), 33 deletions(-) delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constOrJvmFieldProperty.txt diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmStaticChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmStaticChecker.kt index 9694d23a641..873ae06d038 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmStaticChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmStaticChecker.kt @@ -13,9 +13,11 @@ import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.isInterface import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.analysis.checkers.classKind import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker +import org.jetbrains.kotlin.fir.analysis.checkers.fullyExpandedClassId import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.* @@ -24,7 +26,6 @@ import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol -import org.jetbrains.kotlin.fir.types.classId import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.SpecialNames @@ -41,7 +42,7 @@ object FirJvmStaticChecker : FirBasicDeclarationChecker() { return } - val declarationAnnotation = declaration.findAnnotation(StandardClassIds.Annotations.JvmStatic) + val declarationAnnotation = declaration.findAnnotation(StandardClassIds.Annotations.JvmStatic, context.session) if (declarationAnnotation != null) { checkAnnotated(declaration, context, reporter, declaration.source) @@ -200,7 +201,7 @@ object FirJvmStaticChecker : FirBasicDeclarationChecker() { targetSource: KtSourceElement?, ) { if (declaration !is FirProperty) return - if (declaration.isConst || declaration.backingField?.hasAnnotationNamedAs(StandardClassIds.Annotations.JvmField) == true) { + if (declaration.isConst || declaration.backingField?.hasAnnotationNamedAs(StandardClassIds.Annotations.JvmField, context.session) == true) { reporter.reportOn(targetSource, FirJvmErrors.JVM_STATIC_ON_CONST_OR_JVM_FIELD, context) } } @@ -236,13 +237,13 @@ object FirJvmStaticChecker : FirBasicDeclarationChecker() { private fun FirClassLikeSymbol<*>.isCompanion() = (this as? FirRegularClassSymbol)?.isCompanion == true - private fun FirDeclaration.hasAnnotationNamedAs(classId: ClassId): Boolean { - return findAnnotation(classId) != null + private fun FirDeclaration.hasAnnotationNamedAs(classId: ClassId, session: FirSession): Boolean { + return findAnnotation(classId, session) != null } - private fun FirDeclaration.findAnnotation(classId: ClassId): FirAnnotation? { + private fun FirDeclaration.findAnnotation(classId: ClassId, session: FirSession): FirAnnotation? { return annotations.firstOrNull { - it.annotationTypeRef.coneType.classId == classId + it.annotationTypeRef.coneType.fullyExpandedClassId(session) == classId } } } diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constOrJvmFieldProperty.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constOrJvmFieldProperty.kt index 4988573577e..339d7e53d49 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constOrJvmFieldProperty.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constOrJvmFieldProperty.kt @@ -17,3 +17,11 @@ object B { @JvmStatic @JvmField val x = 1; } + +typealias TAStatic = JvmStatic + +object C { + @TAStatic const val z = 1; + + @TAStatic @JvmField val x = 1; +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constOrJvmFieldProperty.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constOrJvmFieldProperty.txt deleted file mode 100644 index af6c64dade2..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmStatic/constOrJvmFieldProperty.txt +++ /dev/null @@ -1,26 +0,0 @@ -package - -public final class A { - public constructor A() - public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int - public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String - - public companion object Companion { - private constructor Companion() - @kotlin.jvm.JvmStatic @field:kotlin.jvm.JvmField public final val x: kotlin.Int = 1 - @kotlin.jvm.JvmStatic public const final val z: kotlin.Int = 1 - public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int - public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String - } -} - -public object B { - private constructor B() - @kotlin.jvm.JvmStatic @field:kotlin.jvm.JvmField public final val x: kotlin.Int = 1 - @kotlin.jvm.JvmStatic public const final val z: kotlin.Int = 1 - public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int - public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String -}