K2: expand type aliases in annotation position #KT-55615 Fixed
This commit is contained in:
committed by
Space Team
parent
3cf811012a
commit
0d50f71fb8
+40
-38
@@ -22,21 +22,21 @@ import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.StandardClassIds
|
||||
|
||||
private fun FirAnnotation.toAnnotationLookupTag(): ConeClassLikeLookupTag? =
|
||||
private fun FirAnnotation.toAnnotationLookupTag(session: FirSession): ConeClassLikeLookupTag? =
|
||||
// this cast fails when we have generic-typed annotations @T
|
||||
(annotationTypeRef.coneType as? ConeClassLikeType)?.lookupTag
|
||||
(annotationTypeRef.coneType as? ConeClassLikeType)?.fullyExpandedType(session)?.lookupTag
|
||||
|
||||
private fun FirAnnotation.toAnnotationLookupTagSafe(): ConeClassLikeLookupTag? =
|
||||
annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag
|
||||
private fun FirAnnotation.toAnnotationLookupTagSafe(session: FirSession): ConeClassLikeLookupTag? =
|
||||
annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.fullyExpandedType(session)?.lookupTag
|
||||
|
||||
fun FirAnnotation.toAnnotationClassId(): ClassId? =
|
||||
toAnnotationLookupTag()?.classId
|
||||
fun FirAnnotation.toAnnotationClassId(session: FirSession): ClassId? =
|
||||
toAnnotationLookupTag(session)?.classId
|
||||
|
||||
fun FirAnnotation.toAnnotationClassIdSafe(): ClassId? =
|
||||
toAnnotationLookupTagSafe()?.classId
|
||||
private fun FirAnnotation.toAnnotationClassIdSafe(session: FirSession): ClassId? =
|
||||
toAnnotationLookupTagSafe(session)?.classId
|
||||
|
||||
private fun FirAnnotation.toAnnotationClass(session: FirSession): FirRegularClass? =
|
||||
toAnnotationLookupTag()?.toSymbol(session)?.fir as? FirRegularClass
|
||||
toAnnotationLookupTag(session)?.toSymbol(session)?.fir as? FirRegularClass
|
||||
|
||||
// TODO: this is temporary solution, we need something better
|
||||
private val FirExpression.callableNameOfMetaAnnotationArgument: Name?
|
||||
@@ -52,22 +52,22 @@ fun FirAnnotationContainer.nonSourceAnnotations(session: FirSession): List<FirAn
|
||||
annotations.filter { annotation ->
|
||||
val firAnnotationClass = annotation.toAnnotationClass(session)
|
||||
firAnnotationClass != null && firAnnotationClass.annotations.none { meta ->
|
||||
meta.toAnnotationClassId() == StandardClassIds.Annotations.Retention &&
|
||||
meta.toAnnotationClassId(session) == StandardClassIds.Annotations.Retention &&
|
||||
meta.findArgumentByName(StandardClassIds.Annotations.ParameterNames.retentionValue)
|
||||
?.callableNameOfMetaAnnotationArgument == sourceName
|
||||
}
|
||||
}
|
||||
|
||||
inline val FirProperty.hasJvmFieldAnnotation: Boolean
|
||||
get() = annotations.any { it.isJvmFieldAnnotation }
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun FirProperty.hasJvmFieldAnnotation(session: FirSession): Boolean = annotations.any { it.isJvmFieldAnnotation(session) }
|
||||
|
||||
val FirAnnotation.isJvmFieldAnnotation: Boolean
|
||||
get() = toAnnotationClassId() == StandardClassIds.Annotations.JvmField
|
||||
fun FirAnnotation.isJvmFieldAnnotation(session: FirSession): Boolean =
|
||||
toAnnotationClassId(session) == StandardClassIds.Annotations.JvmField
|
||||
|
||||
fun FirAnnotation.useSiteTargetsFromMetaAnnotation(session: FirSession): Set<AnnotationUseSiteTarget> {
|
||||
return toAnnotationClass(session)
|
||||
?.annotations
|
||||
?.find { it.toAnnotationClassId() == StandardClassIds.Annotations.Target }
|
||||
?.find { it.toAnnotationClassId(session) == StandardClassIds.Annotations.Target }
|
||||
?.findArgumentByName(StandardClassIds.Annotations.ParameterNames.targetAllowedTargets)
|
||||
?.unwrapVarargValue()
|
||||
?.toAnnotationUseSiteTargets()
|
||||
@@ -101,45 +101,47 @@ private val USE_SITE_TARGET_NAME_MAP = mapOf(
|
||||
private val DEFAULT_USE_SITE_TARGETS: Set<AnnotationUseSiteTarget> =
|
||||
USE_SITE_TARGET_NAME_MAP.values.fold(setOf<AnnotationUseSiteTarget>()) { a, b -> a + b } - setOf(AnnotationUseSiteTarget.FILE)
|
||||
|
||||
fun FirDeclaration.hasAnnotation(classId: ClassId): Boolean {
|
||||
return annotations.hasAnnotation(classId)
|
||||
fun FirDeclaration.hasAnnotation(classId: ClassId, session: FirSession): Boolean {
|
||||
return annotations.hasAnnotation(classId, session)
|
||||
}
|
||||
|
||||
fun FirDeclaration.hasAnnotationSafe(classId: ClassId): Boolean {
|
||||
return annotations.hasAnnotationSafe(classId)
|
||||
fun FirDeclaration.hasAnnotationSafe(classId: ClassId, session: FirSession): Boolean {
|
||||
return annotations.hasAnnotationSafe(classId, session)
|
||||
}
|
||||
|
||||
fun FirBasedSymbol<*>.hasAnnotation(classId: ClassId): Boolean {
|
||||
return resolvedAnnotationsWithClassIds.hasAnnotation(classId)
|
||||
fun FirBasedSymbol<*>.hasAnnotation(classId: ClassId, session: FirSession): Boolean {
|
||||
return resolvedAnnotationsWithClassIds.hasAnnotation(classId, session)
|
||||
}
|
||||
|
||||
fun List<FirAnnotation>.hasAnnotation(classId: ClassId): Boolean {
|
||||
return this.any { it.toAnnotationClassId() == classId }
|
||||
fun List<FirAnnotation>.hasAnnotation(classId: ClassId, session: FirSession): Boolean {
|
||||
return this.any { it.toAnnotationClassId(session) == classId }
|
||||
}
|
||||
|
||||
fun List<FirAnnotation>.hasAnnotationSafe(classId: ClassId): Boolean {
|
||||
return this.any { it.toAnnotationClassIdSafe() == classId }
|
||||
fun List<FirAnnotation>.hasAnnotationSafe(classId: ClassId, session: FirSession): Boolean {
|
||||
return this.any { it.toAnnotationClassIdSafe(session) == classId }
|
||||
}
|
||||
|
||||
fun <D> FirBasedSymbol<out D>.getAnnotationByClassId(classId: ClassId): FirAnnotation? where D : FirAnnotationContainer, D : FirDeclaration {
|
||||
return fir.getAnnotationByClassId(classId)
|
||||
fun <D> FirBasedSymbol<out D>.getAnnotationByClassId(
|
||||
classId: ClassId,
|
||||
session: FirSession
|
||||
): FirAnnotation? where D : FirAnnotationContainer, D : FirDeclaration {
|
||||
return fir.getAnnotationByClassId(classId, session)
|
||||
}
|
||||
|
||||
fun FirAnnotationContainer.getAnnotationByClassId(classId: ClassId): FirAnnotation? {
|
||||
return annotations.getAnnotationByClassId(classId)
|
||||
fun FirAnnotationContainer.getAnnotationByClassId(classId: ClassId, session: FirSession): FirAnnotation? {
|
||||
return annotations.getAnnotationByClassId(classId, session)
|
||||
}
|
||||
|
||||
fun List<FirAnnotation>.getAnnotationByClassId(classId: ClassId): FirAnnotation? {
|
||||
return find {
|
||||
it.annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag?.classId == classId
|
||||
}
|
||||
fun List<FirAnnotation>.getAnnotationByClassId(classId: ClassId, session: FirSession): FirAnnotation? {
|
||||
return getAnnotationsByClassId(classId, session).firstOrNull()
|
||||
}
|
||||
|
||||
fun FirAnnotationContainer.getAnnotationsByClassId(classId: ClassId): List<FirAnnotation> = annotations.getAnnotationsByClassId(classId)
|
||||
fun FirAnnotationContainer.getAnnotationsByClassId(classId: ClassId, session: FirSession): List<FirAnnotation> =
|
||||
annotations.getAnnotationsByClassId(classId, session)
|
||||
|
||||
fun List<FirAnnotation>.getAnnotationsByClassId(classId: ClassId): List<FirAnnotation> {
|
||||
fun List<FirAnnotation>.getAnnotationsByClassId(classId: ClassId, session: FirSession): List<FirAnnotation> {
|
||||
return filter {
|
||||
it.annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag?.classId == classId
|
||||
it.annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.fullyExpandedType(session)?.lookupTag?.classId == classId
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,8 +203,8 @@ fun FirGetClassCall.getTargetType(): ConeKotlinType? {
|
||||
return typeRef.coneType.typeArguments.getOrNull(0)?.type
|
||||
}
|
||||
|
||||
fun FirAnnotationContainer.getJvmNameFromAnnotation(target: AnnotationUseSiteTarget? = null): String? {
|
||||
val annotationCalls = getAnnotationsByClassId(StandardClassIds.Annotations.JvmName)
|
||||
fun FirAnnotationContainer.getJvmNameFromAnnotation(session: FirSession, target: AnnotationUseSiteTarget? = null): String? {
|
||||
val annotationCalls = getAnnotationsByClassId(StandardClassIds.Annotations.JvmName, session)
|
||||
return annotationCalls.firstNotNullOfOrNull { call ->
|
||||
call.getStringArgument(StandardClassIds.Annotations.ParameterNames.jvmNameName)
|
||||
?.takeIf { target == null || call.useSiteTarget == target }
|
||||
|
||||
+22
-16
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.FirAnnotationContainer
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.caches.FirCachesFactory
|
||||
import org.jetbrains.kotlin.fir.caches.firCachesFactory
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.languageVersionSettings
|
||||
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
||||
@@ -90,33 +91,36 @@ fun FirBasedSymbol<*>.getDeprecation(apiVersion: ApiVersion, callSite: FirElemen
|
||||
}
|
||||
}
|
||||
|
||||
fun FirAnnotationContainer.getDeprecationsProvider(firCachesFactory: FirCachesFactory): DeprecationsProvider {
|
||||
return extractDeprecationInfoPerUseSite().toDeprecationsProvider(firCachesFactory)
|
||||
fun FirAnnotationContainer.getDeprecationsProvider(session: FirSession): DeprecationsProvider {
|
||||
return extractDeprecationInfoPerUseSite(session).toDeprecationsProvider(session.firCachesFactory)
|
||||
}
|
||||
|
||||
fun FirAnnotationContainer.extractDeprecationInfoPerUseSite(): DeprecationAnnotationInfoPerUseSiteStorage {
|
||||
fun FirAnnotationContainer.extractDeprecationInfoPerUseSite(session: FirSession): DeprecationAnnotationInfoPerUseSiteStorage {
|
||||
val fromJava = this is FirDeclaration && this.isJavaOrEnhancement
|
||||
|
||||
return buildDeprecationAnnotationInfoPerUseSiteStorage {
|
||||
add(annotations.extractDeprecationAnnotationInfoPerUseSite(fromJava))
|
||||
add(annotations.extractDeprecationAnnotationInfoPerUseSite(session, fromJava))
|
||||
if (this@extractDeprecationInfoPerUseSite is FirProperty) {
|
||||
add(getDeprecationsAnnotationInfoByUseSiteFromAccessors(getter, setter))
|
||||
add(getDeprecationsAnnotationInfoByUseSiteFromAccessors(session, getter, setter))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getDeprecationsProviderFromAccessors(
|
||||
session: FirSession,
|
||||
getter: FirFunction?,
|
||||
setter: FirFunction?,
|
||||
firCachesFactory: FirCachesFactory
|
||||
setter: FirFunction?
|
||||
): DeprecationsProvider {
|
||||
return getDeprecationsAnnotationInfoByUseSiteFromAccessors(getter, setter).toDeprecationsProvider(firCachesFactory)
|
||||
return getDeprecationsAnnotationInfoByUseSiteFromAccessors(session, getter, setter).toDeprecationsProvider(session.firCachesFactory)
|
||||
}
|
||||
|
||||
fun getDeprecationsAnnotationInfoByUseSiteFromAccessors(
|
||||
session: FirSession,
|
||||
getter: FirFunction?,
|
||||
setter: FirFunction?
|
||||
): DeprecationAnnotationInfoPerUseSiteStorage {
|
||||
return buildDeprecationAnnotationInfoPerUseSiteStorage {
|
||||
val setterDeprecations = setter?.extractDeprecationInfoPerUseSite()
|
||||
val setterDeprecations = setter?.extractDeprecationInfoPerUseSite(session)
|
||||
setterDeprecations?.storage?.forEach { (useSite, infos) ->
|
||||
if (useSite == null) {
|
||||
add(AnnotationUseSiteTarget.PROPERTY_SETTER, infos)
|
||||
@@ -124,7 +128,7 @@ fun getDeprecationsAnnotationInfoByUseSiteFromAccessors(
|
||||
add(useSite, infos)
|
||||
}
|
||||
}
|
||||
val getterDeprecations = getter?.extractDeprecationInfoPerUseSite()
|
||||
val getterDeprecations = getter?.extractDeprecationInfoPerUseSite(session)
|
||||
getterDeprecations?.storage?.forEach { (useSite, infos) ->
|
||||
if (useSite == null) {
|
||||
add(AnnotationUseSiteTarget.PROPERTY_GETTER, infos)
|
||||
@@ -136,11 +140,11 @@ fun getDeprecationsAnnotationInfoByUseSiteFromAccessors(
|
||||
}
|
||||
|
||||
fun List<FirAnnotation>.getDeprecationsProviderFromAnnotations(
|
||||
fromJava: Boolean,
|
||||
firCachesFactory: FirCachesFactory
|
||||
session: FirSession,
|
||||
fromJava: Boolean
|
||||
): DeprecationsProvider {
|
||||
val deprecationAnnotationByUseSite = extractDeprecationAnnotationInfoPerUseSite(fromJava)
|
||||
return deprecationAnnotationByUseSite.toDeprecationsProvider(firCachesFactory)
|
||||
val deprecationAnnotationByUseSite = extractDeprecationAnnotationInfoPerUseSite(session, fromJava)
|
||||
return deprecationAnnotationByUseSite.toDeprecationsProvider(session.firCachesFactory)
|
||||
}
|
||||
|
||||
fun FirBasedSymbol<*>.getDeprecationForCallSite(
|
||||
@@ -175,7 +179,7 @@ private fun FirAnnotation.getDeprecationLevel(): DeprecationLevelValue? {
|
||||
}
|
||||
|
||||
private fun List<FirAnnotation>.extractDeprecationAnnotationInfoPerUseSite(
|
||||
fromJava: Boolean
|
||||
session: FirSession, fromJava: Boolean
|
||||
): DeprecationAnnotationInfoPerUseSiteStorage {
|
||||
@Suppress("RemoveExplicitTypeArguments")
|
||||
val annotations = buildList<Pair<FirAnnotation, Boolean>> {
|
||||
@@ -199,7 +203,9 @@ private fun List<FirAnnotation>.extractDeprecationAnnotationInfoPerUseSite(
|
||||
} else {
|
||||
val deprecationLevel = deprecated.getDeprecationLevel() ?: DeprecationLevelValue.WARNING
|
||||
val propagatesToOverride = !fromJavaAnnotation && !fromJava
|
||||
val deprecatedSinceKotlin = getAnnotationsByClassId(StandardClassIds.Annotations.DeprecatedSinceKotlin).firstOrNull()
|
||||
val deprecatedSinceKotlin = getAnnotationsByClassId(
|
||||
StandardClassIds.Annotations.DeprecatedSinceKotlin, session
|
||||
).firstOrNull()
|
||||
val message = deprecated.getStringArgument(ParameterNames.deprecatedMessage)
|
||||
|
||||
val deprecatedInfo =
|
||||
|
||||
@@ -76,11 +76,11 @@ fun FirSymbolProvider.getSymbolByLookupTag(lookupTag: ConeClassLikeLookupTag): F
|
||||
return lookupTag.toSymbol(session)
|
||||
}
|
||||
|
||||
fun ConeKotlinType.withParameterNameAnnotation(parameter: FirFunctionTypeParameter): ConeKotlinType {
|
||||
fun ConeKotlinType.withParameterNameAnnotation(parameter: FirFunctionTypeParameter, session: FirSession): ConeKotlinType {
|
||||
val name = parameter.name
|
||||
if (name == null || name == SpecialNames.NO_NAME_PROVIDED || name == SpecialNames.UNDERSCORE_FOR_UNUSED_VAR) return this
|
||||
// Existing @ParameterName annotation takes precedence
|
||||
if (attributes.customAnnotations.getAnnotationsByClassId(StandardNames.FqNames.parameterNameClassId).isNotEmpty()) return this
|
||||
if (attributes.customAnnotations.getAnnotationsByClassId(StandardNames.FqNames.parameterNameClassId, session).isNotEmpty()) return this
|
||||
|
||||
val fakeSource = parameter.source?.fakeElement(KtFakeSourceElementKind.ParameterNameAnnotationCall)
|
||||
val parameterNameAnnotationCall = buildAnnotation {
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
package org.jetbrains.kotlin.fir.resolve.calls
|
||||
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.caches.firCachesFactory
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
|
||||
@@ -138,7 +137,7 @@ class FirSyntheticPropertiesScope private constructor(
|
||||
)
|
||||
delegateGetter = getter
|
||||
delegateSetter = matchingSetter
|
||||
deprecationsProvider = getDeprecationsProviderFromAccessors(getter, matchingSetter, session.firCachesFactory)
|
||||
deprecationsProvider = getDeprecationsProviderFromAccessors(session, getter, matchingSetter)
|
||||
}
|
||||
val syntheticSymbol = property.symbol
|
||||
(baseScope as? FirUnstableSmartcastTypeScope)?.apply {
|
||||
|
||||
+4
-1
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.providers
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSessionComponent
|
||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||
import org.jetbrains.kotlin.fir.resolve.getSymbolByLookupTag
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.getDeclaredConstructors
|
||||
@@ -16,6 +17,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType
|
||||
import org.jetbrains.kotlin.fir.types.ConeSimpleKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
@@ -78,7 +80,8 @@ fun FirSymbolProvider.getClassDeclaredPropertySymbols(classId: ClassId, name: Na
|
||||
}
|
||||
|
||||
inline fun <reified T : FirBasedSymbol<*>> FirSymbolProvider.getSymbolByTypeRef(typeRef: FirTypeRef): T? {
|
||||
val lookupTag = typeRef.coneTypeSafe<ConeLookupTagBasedType>()?.lookupTag ?: return null
|
||||
val lookupTag = (typeRef.coneTypeSafe<ConeSimpleKotlinType>()?.fullyExpandedType(session) as? ConeLookupTagBasedType)?.lookupTag
|
||||
?: return null
|
||||
return getSymbolByLookupTag(lookupTag) as? T
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.caches.firCachesFactory
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.*
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
@@ -566,7 +565,7 @@ object FirFakeOverrideGenerator {
|
||||
delegateGetter = getter
|
||||
delegateSetter = setter
|
||||
status = baseProperty.status
|
||||
deprecationsProvider = getDeprecationsProviderFromAccessors(getter, setter, session.firCachesFactory)
|
||||
deprecationsProvider = getDeprecationsProviderFromAccessors(session, getter, setter)
|
||||
}.apply {
|
||||
containingClassForStaticMemberAttr = derivedClassLookupTag.takeIf { shouldOverrideSetContainingClass(baseProperty) }
|
||||
}.symbol
|
||||
|
||||
Reference in New Issue
Block a user