K2: expand type aliases in annotation position #KT-55615 Fixed

This commit is contained in:
Mikhail Glukhikh
2022-12-22 12:53:32 +01:00
committed by Space Team
parent 3cf811012a
commit 0d50f71fb8
77 changed files with 345 additions and 348 deletions
@@ -14,12 +14,12 @@ import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
import org.jetbrains.kotlin.name.ClassId
fun DiagnosticReporter.reportIfHasAnnotation(
declaration: FirDeclaration,
declaration: FirDeclaration,
annotationClassId: ClassId,
error: KtDiagnosticFactory0,
context: CheckerContext
) {
val annotation = declaration.getAnnotationByClassId(annotationClassId)
val annotation = declaration.getAnnotationByClassId(annotationClassId, context.session)
if (annotation != null) {
reportOn(annotation.source, error, context)
}
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.FirSession
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.unsubstitutedScope
@@ -51,7 +52,7 @@ object FirNativeObjCNameChecker : FirBasicDeclarationChecker() {
private fun checkDeclaration(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration is FirValueParameter) return // those are checked with the FirFunction
val objCNames = declaration.symbol.getObjCNames().filterNotNull()
val objCNames = declaration.symbol.getObjCNames(context.session).filterNotNull()
if (objCNames.isEmpty()) return
if (declaration is FirCallableDeclaration && declaration.isOverride) {
for (objCName in objCNames) {
@@ -115,20 +116,20 @@ object FirNativeObjCNameChecker : FirBasicDeclarationChecker() {
}
}
private fun FirAnnotationContainer.getObjCName(): ObjCName? =
getAnnotationByClassId(objCNameClassId)?.let(::ObjCName)
private fun FirAnnotationContainer.getObjCName(session: FirSession): ObjCName? =
getAnnotationByClassId(objCNameClassId, session)?.let(::ObjCName)
private fun FirBasedSymbol<*>.getObjCName(): ObjCName? =
getAnnotationByClassId(objCNameClassId)?.let(::ObjCName)
private fun FirBasedSymbol<*>.getObjCName(session: FirSession): ObjCName? =
getAnnotationByClassId(objCNameClassId, session)?.let(::ObjCName)
fun FirBasedSymbol<*>.getObjCNames(): List<ObjCName?> = when (this) {
fun FirBasedSymbol<*>.getObjCNames(session: FirSession): List<ObjCName?> = when (this) {
is FirFunctionSymbol<*> -> buildList {
add((this@getObjCNames as FirBasedSymbol<*>).getObjCName())
add(resolvedReceiverTypeRef?.getObjCName())
add(receiverParameter?.getObjCName())
valueParameterSymbols.forEach { add(it.getObjCName()) }
add((this@getObjCNames as FirBasedSymbol<*>).getObjCName(session))
add(resolvedReceiverTypeRef?.getObjCName(session))
add(receiverParameter?.getObjCName(session))
valueParameterSymbols.forEach { add(it.getObjCName(session)) }
}
else -> listOf(getObjCName())
else -> listOf(getObjCName(session))
}
}
@@ -44,9 +44,11 @@ object FirNativeObjCNameOverridesChecker : FirClassChecker() {
) {
val overriddenSymbols = firTypeScope.retrieveDirectOverriddenOf(memberSymbol)
if (overriddenSymbols.isEmpty()) return
val objCNames = overriddenSymbols.map { it.getFirstBaseSymbol(firTypeScope).getObjCNames() }
val objCNames = overriddenSymbols.map { it.getFirstBaseSymbol(firTypeScope).getObjCNames(context.session) }
if (!objCNames.allNamesEquals()) {
val containingDeclarations = overriddenSymbols.mapNotNull { it.containingClassLookupTag()?.toFirRegularClassSymbol(context.session) }
val containingDeclarations = overriddenSymbols.mapNotNull {
it.containingClassLookupTag()?.toFirRegularClassSymbol(context.session)
}
reporter.reportOn(
declarationToReport.source,
INCOMPATIBLE_OBJC_NAME_OVERRIDE,
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
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.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirRegularClassChecker
import org.jetbrains.kotlin.fir.analysis.checkers.getAllowedAnnotationTargets
@@ -24,7 +25,8 @@ object FirNativeObjCRefinementAnnotationChecker : FirRegularClassChecker() {
override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration.classKind != ClassKind.ANNOTATION_CLASS) return
val (objCAnnotation, swiftAnnotation) = declaration.findMetaAnnotations()
val session = context.session
val (objCAnnotation, swiftAnnotation) = declaration.findMetaAnnotations(session)
if (objCAnnotation == null && swiftAnnotation == null) return
if (objCAnnotation != null && swiftAnnotation != null) {
reporter.reportOn(
@@ -33,7 +35,7 @@ object FirNativeObjCRefinementAnnotationChecker : FirRegularClassChecker() {
context
)
}
val targets = declaration.getAllowedAnnotationTargets()
val targets = declaration.getAllowedAnnotationTargets(session)
val unsupportedTargets = targets - supportedTargets
if (unsupportedTargets.isNotEmpty()) {
objCAnnotation?.let { reporter.reportOn(it.source, FirNativeErrors.INVALID_OBJC_REFINEMENT_TARGETS, context) }
@@ -41,11 +43,11 @@ object FirNativeObjCRefinementAnnotationChecker : FirRegularClassChecker() {
}
}
private fun FirRegularClass.findMetaAnnotations(): Pair<FirAnnotation?, FirAnnotation?> {
private fun FirRegularClass.findMetaAnnotations(session: FirSession): Pair<FirAnnotation?, FirAnnotation?> {
var objCAnnotation: FirAnnotation? = null
var swiftAnnotation: FirAnnotation? = null
for (annotation in annotations) {
when (annotation.toAnnotationClassId()) {
when (annotation.toAnnotationClassId(session)) {
hidesFromObjCClassId -> objCAnnotation = annotation
refinesInSwiftClassId -> swiftAnnotation = annotation
}
@@ -46,7 +46,7 @@ object FirNativeObjCRefinementChecker : FirCallableDeclarationChecker() {
for (annotation in annotations) {
val metaAnnotations = annotation.coneClassLikeType?.lookupTag?.toSymbol(session)?.resolvedAnnotationsWithClassIds.orEmpty()
for (metaAnnotation in metaAnnotations) {
when (metaAnnotation.toAnnotationClassId()) {
when (metaAnnotation.toAnnotationClassId(session)) {
hidesFromObjCClassId -> {
objCAnnotations.add(annotation)
break
@@ -85,7 +85,7 @@ object FirNativeObjCRefinementOverridesChecker : FirClassChecker() {
for (annotation in resolvedAnnotationsWithClassIds) {
val metaAnnotations = annotation.coneClassLikeType?.lookupTag?.toSymbol(session)?.resolvedAnnotationsWithClassIds.orEmpty()
for (metaAnnotation in metaAnnotations) {
when (metaAnnotation.toAnnotationClassId()) {
when (metaAnnotation.toAnnotationClassId(session)) {
hidesFromObjCClassId -> {
hasObjC = true
break
@@ -45,7 +45,7 @@ object FirNativeThrowsChecker : FirBasicDeclarationChecker() {
)
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
val throwsAnnotation = declaration.getAnnotationByClassId(throwsClassId) as? FirAnnotationCall
val throwsAnnotation = declaration.getAnnotationByClassId(throwsClassId, context.session) as? FirAnnotationCall
if (!checkInheritance(declaration, throwsAnnotation, context, reporter)) return
@@ -123,7 +123,7 @@ object FirNativeThrowsChecker : FirBasicDeclarationChecker() {
val annotation = if (overriddenFunction.isSubstitutionOrIntersectionOverride) {
null
} else {
overriddenFunction.getAnnotationByClassId(throwsClassId) as? FirAnnotationCall
overriddenFunction.getAnnotationByClassId(throwsClassId, context.session) as? FirAnnotationCall
}
getInheritedThrows(annotation, overriddenFunction)
}