[FIR] Support typealiases in FirJsRuntimeAnnotationChecker

This commit is contained in:
Nikolay Lunyak
2023-01-11 10:52:33 +02:00
committed by Space Team
parent fc285c079e
commit 2e8b177262
4 changed files with 22 additions and 7 deletions
@@ -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)
@@ -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?
@@ -30,6 +30,11 @@ external class B {
val r: Int
}
typealias TY = Y
<!RUNTIME_ANNOTATION_ON_EXTERNAL_DECLARATION!>@TY<!>
external class BB
@X
class C {
@X
@@ -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