Skip to content

Commit 5a74fec

Browse files
dimonchik0036Space Team
authored andcommitted
[AA] KtAnnotated: split hasAnnotation to two extensions
1 parent 2c305b4 commit 5a74fec

File tree

11 files changed

+90
-44
lines changed

11 files changed

+90
-44
lines changed

analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/annotations/KtFe10AnnotationsList.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,15 @@ internal class KtFe10AnnotationsList private constructor(
4545
}
4646
}
4747

48+
override fun hasAnnotation(classId: ClassId): Boolean = withValidityAssertion {
49+
fe10Annotations.hasAnnotation(classId.asSingleFqName())
50+
}
51+
4852
override fun hasAnnotation(
4953
classId: ClassId,
5054
useSiteTarget: AnnotationUseSiteTarget?,
51-
strictUseSite: Boolean,
52-
): Boolean = withValidityAssertion {
53-
fe10Annotations.hasAnnotation(classId.asSingleFqName())
54-
}
55+
acceptAnnotationsWithoutUseSite: Boolean,
56+
): Boolean = hasAnnotation(classId)
5557

5658
override fun annotationsByClassId(classId: ClassId): List<KtAnnotationApplication> = withValidityAssertion {
5759
if (classId in annotationsToIgnore) return@withValidityAssertion emptyList()

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForDeclaration.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,17 @@ internal class KtFirAnnotationListForDeclaration private constructor(
3333
override fun hasAnnotation(
3434
classId: ClassId,
3535
useSiteTarget: AnnotationUseSiteTarget?,
36-
strictUseSite: Boolean,
36+
acceptAnnotationsWithoutUseSite: Boolean,
3737
): Boolean = withValidityAssertion {
3838
firSymbol.resolvedAnnotationsWithClassIds.any {
39-
(it.useSiteTarget == useSiteTarget || !strictUseSite && it.useSiteTarget == null) && it.fullyExpandedClassId(useSiteSession) == classId
39+
(it.useSiteTarget == useSiteTarget || acceptAnnotationsWithoutUseSite && it.useSiteTarget == null) &&
40+
it.fullyExpandedClassId(useSiteSession) == classId
41+
}
42+
}
43+
44+
override fun hasAnnotation(classId: ClassId): Boolean = withValidityAssertion {
45+
firSymbol.resolvedAnnotationsWithClassIds.any {
46+
it.fullyExpandedClassId(useSiteSession) == classId
4047
}
4148
}
4249

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForReceiverParameter.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,17 @@ internal class KtFirAnnotationListForReceiverParameter private constructor(
3838
override fun hasAnnotation(
3939
classId: ClassId,
4040
useSiteTarget: AnnotationUseSiteTarget?,
41-
strictUseSite: Boolean,
41+
acceptAnnotationsWithoutUseSite: Boolean,
4242
): Boolean = withValidityAssertion {
4343
receiverParameter.resolvedAnnotationsWithClassIds(firCallableSymbol).any {
44-
(it.useSiteTarget == useSiteTarget || !strictUseSite && it.useSiteTarget == null) && it.fullyExpandedClassId(useSiteSession) == classId
44+
(it.useSiteTarget == useSiteTarget || acceptAnnotationsWithoutUseSite && it.useSiteTarget == null) &&
45+
it.fullyExpandedClassId(useSiteSession) == classId
46+
}
47+
}
48+
49+
override fun hasAnnotation(classId: ClassId): Boolean = withValidityAssertion {
50+
receiverParameter.resolvedAnnotationsWithClassIds(firCallableSymbol).any {
51+
it.fullyExpandedClassId(useSiteSession) == classId
4552
}
4653
}
4754

analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForType.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,17 @@ internal class KtFirAnnotationListForType private constructor(
2929
override fun hasAnnotation(
3030
classId: ClassId,
3131
useSiteTarget: AnnotationUseSiteTarget?,
32-
strictUseSite: Boolean,
32+
acceptAnnotationsWithoutUseSite: Boolean,
3333
): Boolean = withValidityAssertion {
3434
coneType.customAnnotations.any {
35-
(it.useSiteTarget == useSiteTarget || !strictUseSite && it.useSiteTarget == null) && it.fullyExpandedClassId(useSiteSession) == classId
35+
(it.useSiteTarget == useSiteTarget || acceptAnnotationsWithoutUseSite && it.useSiteTarget == null) &&
36+
it.fullyExpandedClassId(useSiteSession) == classId
37+
}
38+
}
39+
40+
override fun hasAnnotation(classId: ClassId): Boolean = withValidityAssertion {
41+
coneType.customAnnotations.any {
42+
it.fullyExpandedClassId(useSiteSession) == classId
3643
}
3744
}
3845

analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/annotations/KtEmptyAnnotationsList.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ class KtEmptyAnnotationsList(override val token: KtLifetimeToken) : KtAnnotation
1919
override fun hasAnnotation(
2020
classId: ClassId,
2121
useSiteTarget: AnnotationUseSiteTarget?,
22-
strictUseSite: Boolean,
22+
acceptAnnotationsWithoutUseSite: Boolean,
2323
): Boolean = withValidityAssertion { false }
2424

25+
override fun hasAnnotation(classId: ClassId): Boolean = withValidityAssertion { false }
26+
2527
override fun annotationsByClassId(classId: ClassId): List<KtAnnotationApplication> =
2628
withValidityAssertion { emptyList() }
2729

analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/annotations/KtAnnotated.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,18 @@ public val KtAnnotated.annotations: List<KtAnnotationApplication>
2828
*
2929
* @see [KtAnnotationsList.hasAnnotation]
3030
*/
31+
public fun KtAnnotated.hasAnnotation(classId: ClassId): Boolean = annotationsList.hasAnnotation(classId)
32+
33+
/**
34+
* Checks if entity has annotation with specified [classId] and [useSiteTarget].
35+
*
36+
* @see [KtAnnotationsList.hasAnnotation]
37+
*/
3138
public fun KtAnnotated.hasAnnotation(
3239
classId: ClassId,
33-
useSiteTarget: AnnotationUseSiteTarget? = null,
34-
strictUseSite: Boolean = true,
35-
): Boolean = annotationsList.hasAnnotation(classId, useSiteTarget, strictUseSite)
40+
useSiteTarget: AnnotationUseSiteTarget?,
41+
acceptAnnotationsWithoutUseSite: Boolean = false,
42+
): Boolean = annotationsList.hasAnnotation(classId, useSiteTarget, acceptAnnotationsWithoutUseSite)
3643

3744
/**
3845
* A list of annotations applied with specified [classId].

analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/annotations/KtAnnotationsList.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,29 @@ public abstract class KtAnnotationsList : KtLifetimeOwner {
3030
* The semantic is equivalent to
3131
* ```
3232
* annotationsList.hasAnnotation(classId) == annotationsList.annotations.any { it.classId == classId }
33+
* ```
34+
*/
35+
public abstract fun hasAnnotation(classId: ClassId): Boolean
36+
37+
/**
38+
* Checks if entity contains annotation with specified [classId] and [useSiteTarget].
39+
* If [useSiteTarget] is **null** [acceptAnnotationsWithoutUseSite] effectively unused.
3340
*
41+
* The semantic is equivalent to
42+
* ```
3443
* annotationsList.hasAnnotation(classId, useSiteTarget, strictUseSite) == annotationsList.annotations.any {
35-
* (it.useSiteTarget == useSiteTarget || !strictUseSite && it.useSiteTarget == null) && it.classId == classId
44+
* (it.useSiteTarget == useSiteTarget || acceptAnnotationsWithoutUseSite && it.useSiteTarget == null) && it.classId == classId
3645
* }
3746
* ```
47+
*
48+
* @param classId [ClassId] to search
49+
* @param useSiteTarget specific [AnnotationUseSiteTarget]
50+
* @param acceptAnnotationsWithoutUseSite add [ClassId] without specified [AnnotationUseSiteTarget] to search
3851
*/
3952
public abstract fun hasAnnotation(
4053
classId: ClassId,
41-
useSiteTarget: AnnotationUseSiteTarget? = null,
42-
strictUseSite: Boolean = true,
54+
useSiteTarget: AnnotationUseSiteTarget?,
55+
acceptAnnotationsWithoutUseSite: Boolean = false,
4356
): Boolean
4457

4558
/**

analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/symbolAnnotationsUtils.kt

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ import java.lang.annotation.ElementType
3636

3737
internal fun KtAnnotatedSymbol.hasJvmSyntheticAnnotation(
3838
annotationUseSiteTarget: AnnotationUseSiteTarget? = null,
39-
strictUseSite: Boolean = true,
40-
): Boolean = hasAnnotation(JVM_SYNTHETIC_ANNOTATION_CLASS_ID, annotationUseSiteTarget, strictUseSite)
39+
acceptAnnotationsWithoutUseSite: Boolean = false,
40+
): Boolean = hasAnnotation(JVM_SYNTHETIC_ANNOTATION_CLASS_ID, annotationUseSiteTarget, acceptAnnotationsWithoutUseSite)
4141

4242
internal fun KtAnnotatedSymbol.getJvmNameFromAnnotation(annotationUseSiteTarget: AnnotationUseSiteTarget? = null): String? {
43-
val annotation = findAnnotation(StandardClassIds.Annotations.JvmName, annotationUseSiteTarget, strictUseSite = false)
43+
val annotation = findAnnotation(StandardClassIds.Annotations.JvmName, annotationUseSiteTarget, acceptAnnotationsWithoutUseSite = true)
4444
return annotation?.let {
4545
(it.arguments.firstOrNull()?.expression as? KtConstantAnnotationValue)?.constantValue?.value as? String
4646
}
@@ -55,8 +55,9 @@ internal fun isHiddenByDeprecation(
5555
context(KtAnalysisSession)
5656
internal fun KtAnnotatedSymbol.isHiddenOrSynthetic(
5757
annotationUseSiteTarget: AnnotationUseSiteTarget? = null,
58-
strictUseSite: Boolean = true,
59-
) = isHiddenByDeprecation(this, annotationUseSiteTarget) || hasJvmSyntheticAnnotation(annotationUseSiteTarget, strictUseSite)
58+
acceptAnnotationsWithoutUseSite: Boolean = false,
59+
) = isHiddenByDeprecation(this, annotationUseSiteTarget) ||
60+
hasJvmSyntheticAnnotation(annotationUseSiteTarget, acceptAnnotationsWithoutUseSite)
6061

6162
internal fun KtAnnotatedSymbol.hasJvmFieldAnnotation(): Boolean = hasAnnotation(StandardClassIds.Annotations.JvmField)
6263

@@ -65,28 +66,28 @@ internal fun KtAnnotatedSymbol.hasPublishedApiAnnotation(annotationUseSiteTarget
6566

6667
internal fun KtAnnotatedSymbol.hasDeprecatedAnnotation(
6768
annotationUseSiteTarget: AnnotationUseSiteTarget? = null,
68-
strictUseSite: Boolean = true,
69-
): Boolean = hasAnnotation(StandardClassIds.Annotations.Deprecated, annotationUseSiteTarget, strictUseSite)
69+
acceptAnnotationsWithoutUseSite: Boolean = false,
70+
): Boolean = hasAnnotation(StandardClassIds.Annotations.Deprecated, annotationUseSiteTarget, acceptAnnotationsWithoutUseSite)
7071

7172
internal fun KtAnnotatedSymbol.hasJvmOverloadsAnnotation(): Boolean = hasAnnotation(JVM_OVERLOADS_CLASS_ID)
7273

7374
internal fun KtAnnotatedSymbol.hasJvmStaticAnnotation(
7475
annotationUseSiteTarget: AnnotationUseSiteTarget? = null,
75-
strictUseSite: Boolean = true,
76-
): Boolean = hasAnnotation(StandardClassIds.Annotations.JvmStatic, annotationUseSiteTarget, strictUseSite)
76+
acceptAnnotationsWithoutUseSite: Boolean = false,
77+
): Boolean = hasAnnotation(StandardClassIds.Annotations.JvmStatic, annotationUseSiteTarget, acceptAnnotationsWithoutUseSite)
7778

7879
internal fun KtAnnotatedSymbol.hasInlineOnlyAnnotation(): Boolean = hasAnnotation(StandardClassIds.Annotations.InlineOnly)
7980

8081
internal fun KtAnnotatedSymbol.findAnnotation(
8182
classId: ClassId,
8283
annotationUseSiteTarget: AnnotationUseSiteTarget?,
83-
strictUseSite: Boolean = true,
84+
acceptAnnotationsWithoutUseSite: Boolean = false,
8485
): KtAnnotationApplication? {
85-
if (!hasAnnotation(classId, annotationUseSiteTarget, strictUseSite)) return null
86+
if (!hasAnnotation(classId, annotationUseSiteTarget, acceptAnnotationsWithoutUseSite)) return null
8687

8788
return annotations.find {
8889
val useSiteTarget = it.useSiteTarget
89-
(useSiteTarget == annotationUseSiteTarget || !strictUseSite && useSiteTarget == null) && it.classId == classId
90+
(useSiteTarget == annotationUseSiteTarget || acceptAnnotationsWithoutUseSite && useSiteTarget == null) && it.classId == classId
9091
}
9192
}
9293

@@ -291,14 +292,14 @@ internal fun KtAnnotatedSymbol.computeThrowsList(
291292
annotationUseSiteTarget: AnnotationUseSiteTarget?,
292293
useSitePosition: PsiElement,
293294
containingClass: SymbolLightClassBase,
294-
strictUseSite: Boolean = true,
295+
acceptAnnotationsWithoutUseSite: Boolean = false,
295296
) {
296297
if (containingClass.isEnum && this is KtFunctionSymbol && name == StandardNames.ENUM_VALUE_OF && isStatic) {
297298
builder.addReference(java.lang.IllegalArgumentException::class.qualifiedName)
298299
builder.addReference(java.lang.NullPointerException::class.qualifiedName)
299300
}
300301

301-
val annoApp = findAnnotation(StandardClassIds.Annotations.Throws, annotationUseSiteTarget, strictUseSite) ?: return
302+
val annoApp = findAnnotation(StandardClassIds.Annotations.Throws, annotationUseSiteTarget, acceptAnnotationsWithoutUseSite) ?: return
302303

303304
fun handleAnnotationValue(annotationValue: KtAnnotationValue) = when (annotationValue) {
304305
is KtArrayAnnotationValue -> {

analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -292,14 +292,14 @@ internal fun SymbolLightClassBase.createPropertyAccessors(
292292

293293
fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean {
294294
if (onlyJvmStatic &&
295-
!hasJvmStaticAnnotation(siteTarget, strictUseSite = false) &&
296-
!declaration.hasJvmStaticAnnotation(siteTarget, strictUseSite = false)
295+
!hasJvmStaticAnnotation(siteTarget, acceptAnnotationsWithoutUseSite = true) &&
296+
!declaration.hasJvmStaticAnnotation(siteTarget, acceptAnnotationsWithoutUseSite = true)
297297
) return false
298298

299299
if (declaration.hasReifiedParameters) return false
300300
if (!hasBody && visibility.isPrivateOrPrivateToThis()) return false
301301
if (declaration.isHiddenOrSynthetic(siteTarget)) return false
302-
return !isHiddenOrSynthetic(siteTarget, strictUseSite = false)
302+
return !isHiddenOrSynthetic(siteTarget, acceptAnnotationsWithoutUseSite = true)
303303
}
304304

305305
val originalElement = declaration.sourcePsiSafe<KtDeclaration>()
@@ -384,7 +384,7 @@ private fun hasBackingField(property: KtPropertySymbol): Boolean {
384384
}
385385

386386
if (property.modality == Modality.ABSTRACT ||
387-
property.isHiddenOrSynthetic(AnnotationUseSiteTarget.FIELD, strictUseSite = false)
387+
property.isHiddenOrSynthetic(AnnotationUseSiteTarget.FIELD, acceptAnnotationsWithoutUseSite = true)
388388
) return false
389389

390390
return hasBackingFieldByPsi ?: property.hasBackingField

analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ internal class SymbolLightFieldForProperty private constructor(
8383

8484
private val _isDeprecated: Boolean by lazyPub {
8585
withPropertySymbol { propertySymbol ->
86-
propertySymbol.hasDeprecatedAnnotation(AnnotationUseSiteTarget.FIELD, strictUseSite = false)
86+
propertySymbol.hasDeprecatedAnnotation(AnnotationUseSiteTarget.FIELD, acceptAnnotationsWithoutUseSite = true)
8787
}
8888
}
8989

@@ -115,12 +115,12 @@ internal class SymbolLightFieldForProperty private constructor(
115115
}
116116

117117
PsiModifier.VOLATILE -> withPropertySymbol { propertySymbol ->
118-
val hasAnnotation = propertySymbol.hasAnnotation(VOLATILE_ANNOTATION_CLASS_ID)
118+
val hasAnnotation = propertySymbol.hasAnnotation(VOLATILE_ANNOTATION_CLASS_ID, null)
119119
mapOf(modifier to hasAnnotation)
120120
}
121121

122122
PsiModifier.TRANSIENT -> withPropertySymbol { propertySymbol ->
123-
val hasAnnotation = propertySymbol.hasAnnotation(TRANSIENT_ANNOTATION_CLASS_ID)
123+
val hasAnnotation = propertySymbol.hasAnnotation(TRANSIENT_ANNOTATION_CLASS_ID, null)
124124
mapOf(modifier to hasAnnotation)
125125
}
126126

0 commit comments

Comments
 (0)