diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsRuntimeAnnotationChecker.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsRuntimeAnnotationChecker.kt index 70ef8798117..7bfd539a26a 100644 --- a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsRuntimeAnnotationChecker.kt +++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsRuntimeAnnotationChecker.kt @@ -12,16 +12,13 @@ import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclaratio import org.jetbrains.kotlin.fir.analysis.checkers.getExplicitAnnotationRetention import org.jetbrains.kotlin.fir.analysis.js.checkers.isEffectivelyExternal import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors -import org.jetbrains.kotlin.fir.declarations.FirDeclaration -import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration -import org.jetbrains.kotlin.fir.expressions.unexpandedConeClassLikeType -import org.jetbrains.kotlin.fir.resolve.toSymbol +import org.jetbrains.kotlin.fir.declarations.* object FirJsRuntimeAnnotationChecker : FirBasicDeclarationChecker() { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { for (annotation in declaration.annotations) { - val annotationClass = annotation.unexpandedConeClassLikeType?.lookupTag?.toSymbol(context.session) ?: continue - if (annotationClass.getExplicitAnnotationRetention(context.session) != AnnotationRetention.RUNTIME) continue + val annotationClassSymbol = annotation.toAnnotationClassLikeSymbol(context.session) ?: continue + if (annotationClassSymbol.getExplicitAnnotationRetention(context.session) != AnnotationRetention.RUNTIME) continue if (declaration is FirMemberDeclaration && declaration.symbol.isEffectivelyExternal(context)) { reporter.reportOn(annotation.source, FirJsErrors.RUNTIME_ANNOTATION_ON_EXTERNAL_DECLARATION, context) diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt index f5aba8323b0..55bef2deab9 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationUtils.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -35,8 +36,11 @@ fun FirAnnotation.toAnnotationClassId(session: FirSession): ClassId? = private fun FirAnnotation.toAnnotationClassIdSafe(session: FirSession): ClassId? = toAnnotationLookupTagSafe(session)?.classId +fun FirAnnotation.toAnnotationClassLikeSymbol(session: FirSession): FirClassLikeSymbol<*>? = + toAnnotationLookupTag(session)?.toSymbol(session) + private fun FirAnnotation.toAnnotationClass(session: FirSession): FirRegularClass? = - toAnnotationLookupTag(session)?.toSymbol(session)?.fir as? FirRegularClass + toAnnotationClassLikeSymbol(session)?.fir as? FirRegularClass // TODO: this is temporary solution, we need something better private val FirExpression.callableNameOfMetaAnnotationArgument: Name? diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/runtimeAnnotations.kt b/compiler/testData/diagnostics/testsWithJsStdLib/runtimeAnnotations.kt index 677bda33ca1..0d08cae6f0b 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/runtimeAnnotations.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/runtimeAnnotations.kt @@ -30,6 +30,11 @@ external class B { val r: Int } +typealias TY = Y + +@TY +external class BB + @X class C { @X diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/runtimeAnnotations.txt b/compiler/testData/diagnostics/testsWithJsStdLib/runtimeAnnotations.txt index a0f5360d471..98809ddae96 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/runtimeAnnotations.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/runtimeAnnotations.txt @@ -20,6 +20,13 @@ package public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } +@TY /* = Y */ public final external class BB { + public constructor BB() + 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 +} + @X public final class C { public constructor C() @X public final val p: kotlin.Int = 0 @@ -55,3 +62,5 @@ package public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } +public typealias TY = Y +