From 956ace3463b07a90605de7d48a5554371e96ede9 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 28 Apr 2017 20:28:51 +0300 Subject: [PATCH] Light classes: modifierList#findAnnotation does not trigger exact resolve --- .../asJava/elements/KtLightModifierList.kt | 4 ++-- .../kotlin/asJava/elements/lightAnnotations.kt | 8 ++++++++ .../resolve/AbstractIdeLightClassTest.kt | 18 ++++++++++++++++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightModifierList.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightModifierList.kt index 3c8d3dff50f..da055059d23 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightModifierList.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightModifierList.kt @@ -49,7 +49,7 @@ abstract class KtLightModifierList = annotations override fun getAnnotations(): Array = _annotations.toTypedArray() - override fun findAnnotation(qualifiedName: String) = annotations.firstOrNull { it.qualifiedName == qualifiedName } + override fun findAnnotation(qualifiedName: String) = _annotations.firstOrNull { it.fqNameMatches(qualifiedName) } override fun getParent() = owner override fun getText(): String? = "" override fun getTextRange() = TextRange.EMPTY_RANGE @@ -68,7 +68,7 @@ class KtLightSimpleModifierList( override fun copy() = KtLightSimpleModifierList(owner, modifiers) } -private fun computeAnnotations(lightModifierList: KtLightModifierList<*>): List { +private fun computeAnnotations(lightModifierList: KtLightModifierList<*>): List { val annotationsForEntries = lightAnnotationsForEntries(lightModifierList) val modifierListOwner = lightModifierList.parent if (modifierListOwner is KtLightClassForSourceDeclaration && modifierListOwner.isAnnotationType) { diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt index aed9e73957b..46778c4bdff 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt @@ -45,6 +45,8 @@ abstract class KtLightAbstractAnnotation(parent: PsiElement, computeDelegate: () override fun getMetaData() = clsDelegate.metaData override fun getParameterList() = clsDelegate.parameterList + + open fun fqNameMatches(fqName: String): Boolean = qualifiedName == fqName } class KtLightAnnotationForSourceEntry( @@ -226,6 +228,12 @@ class KtLightNullabilityAnnotation(member: KtLightElement<*, PsiModifierListOwne isNullabilityAnnotation(it.qualifiedName) } ?: KtLightNonExistentAnnotation(member) }) { + override fun fqNameMatches(fqName: String): Boolean { + if (!isNullabilityAnnotation(fqName)) return false + + return super.fqNameMatches(fqName) + } + override val kotlinOrigin get() = null override fun setDeclaredAttributeValue(attributeName: String?, value: T?) = cannotModify() diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt index 27d0ed90b6a..3b1966ec7f1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt @@ -279,6 +279,7 @@ object LightClassLazinessChecker { ) private fun classInfo(psiClass: PsiClass) = with(psiClass) { + checkModifierList(modifierList!!) ClassInfo(fields.names(), methods.names(), PsiModifier.MODIFIERS.asList().filter { modifierList!!.hasModifierProperty(it) }) } @@ -288,7 +289,7 @@ object LightClassLazinessChecker { ) private fun fieldInfo(field: PsiField) = with(field) { - modifierList?.annotations // check getting annotations list doesn't trigger exact resolve + checkModifierList(modifierList!!) FieldInfo( name!!, PsiModifier.MODIFIERS.asList().filter { modifierList!!.hasModifierProperty(it) } @@ -304,7 +305,7 @@ object LightClassLazinessChecker { ) private fun methodInfo(method: PsiMethod, lazinessMode: Mode) = with(method) { - modifierList.annotations // check getting annotations list doesn't trigger exact resolve + checkModifierList(method.modifierList) MethodInfo( name, relevantModifiers(lazinessMode), @@ -323,6 +324,19 @@ object LightClassLazinessChecker { lazinessMode == Mode.NoLaziness || it !in visibilityModifiers }.filter { modifierList.hasModifierProperty(it) } + private fun checkModifierList(modifierList: PsiModifierList) { + // see org.jetbrains.kotlin.asJava.elements.KtLightNonSourceAnnotation + val isAnnotationClass = (modifierList.parent as? PsiClass)?.isAnnotationType ?: false + + if (!isAnnotationClass) { + // check getting annotations list doesn't trigger exact resolve + modifierList.annotations + + // check searching for non-existent annotation doesn't trigger exact resolve + modifierList.findAnnotation("some.package.MadeUpAnnotation") + } + } + private fun Array.names() = mapTo(LinkedHashSet()) { it.name!! } }