From ba3ea40a70cc6cf02e8d066984e62d48581b2fa5 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Thu, 26 Jan 2023 18:11:49 +0100 Subject: [PATCH] [SLC] introduce AnnotationFilter ^KT-56046 --- .../annotations/AlwaysAllowedAnnotationFilter.kt | 13 +++++++++++++ .../symbol/annotations/AnnotationFilter.kt | 13 +++++++++++++ .../symbol/annotations/LazyAnnotationsBox.kt | 8 +++++++- .../symbol/annotations/SimpleAnnotationFilter.kt | 15 +++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AlwaysAllowedAnnotationFilter.kt create mode 100644 analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AnnotationFilter.kt create mode 100644 analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SimpleAnnotationFilter.kt diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AlwaysAllowedAnnotationFilter.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AlwaysAllowedAnnotationFilter.kt new file mode 100644 index 00000000000..18804c01340 --- /dev/null +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AlwaysAllowedAnnotationFilter.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.light.classes.symbol.annotations + +import com.intellij.psi.PsiAnnotation + +internal object AlwaysAllowedAnnotationFilter : AnnotationFilter { + override fun isAllowed(qualifiedName: String): Boolean = true + override fun filtered(annotations: Collection): Collection = annotations +} diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AnnotationFilter.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AnnotationFilter.kt new file mode 100644 index 00000000000..844edada355 --- /dev/null +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/AnnotationFilter.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.light.classes.symbol.annotations + +import com.intellij.psi.PsiAnnotation + +internal sealed interface AnnotationFilter { + fun isAllowed(qualifiedName: String): Boolean + fun filtered(annotations: Collection): Collection +} diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/LazyAnnotationsBox.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/LazyAnnotationsBox.kt index f7912485f19..6be24388221 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/LazyAnnotationsBox.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/LazyAnnotationsBox.kt @@ -15,6 +15,7 @@ import java.util.concurrent.atomic.AtomicReference internal class LazyAnnotationsBox( private val annotationsProvider: AnnotationsProvider, private val additionalAnnotationsProvider: AdditionalAnnotationsProvider = EmptyAdditionalAnnotationsProvider, + private val annotationFilter: AnnotationFilter = AlwaysAllowedAnnotationFilter, ) : AnnotationsBox { private val annotationsArray: AtomicReference?> = AtomicReference() private var specialAnnotations: SmartList? = null @@ -42,8 +43,9 @@ internal class LazyAnnotationsBox( val foundQualifiers = annotations.mapNotNullTo(hashSetOf()) { it.qualifiedName } additionalAnnotationsProvider.addAllAnnotations(annotations, foundQualifiers, owner) + val resultAnnotations = annotationFilter.filtered(annotations) specialAnnotations = null - setAnnotationsArray(if (annotations.isNotEmpty()) annotations.toTypedArray() else PsiAnnotation.EMPTY_ARRAY) + setAnnotationsArray(if (resultAnnotations.isNotEmpty()) resultAnnotations.toTypedArray() else PsiAnnotation.EMPTY_ARRAY) } return valueToReturn @@ -62,6 +64,8 @@ internal class LazyAnnotationsBox( ): PsiAnnotation? = findAnnotation(owner, qualifiedName, withAdditionalAnnotations = true) fun findAnnotation(owner: PsiModifierList, qualifiedName: String, withAdditionalAnnotations: Boolean): PsiAnnotation? { + if (!annotationFilter.isAllowed(qualifiedName)) return null + annotationsArray.get()?.let { array -> return array.find { it.qualifiedName == qualifiedName } } @@ -108,6 +112,8 @@ internal class LazyAnnotationsBox( } override fun hasAnnotation(owner: PsiModifierList, qualifiedName: String): Boolean { + if (!annotationFilter.isAllowed(qualifiedName)) return false + annotationsArray.get()?.let { array -> return array.any { it.qualifiedName == qualifiedName } } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SimpleAnnotationFilter.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SimpleAnnotationFilter.kt new file mode 100644 index 00000000000..2e250fcb1fb --- /dev/null +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SimpleAnnotationFilter.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.light.classes.symbol.annotations + +import com.intellij.psi.PsiAnnotation + +internal class SimpleAnnotationFilter(private val allowedQualifiers: Collection) : AnnotationFilter { + override fun isAllowed(qualifiedName: String): Boolean = qualifiedName in allowedQualifiers + override fun filtered(annotations: Collection): Collection = annotations.filter { annotation -> + annotation.qualifiedName?.let(::isAllowed) == true + } +}