diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolLightAbstractAnnotation.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolLightAbstractAnnotation.kt index f4c26209188..7f317a58391 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolLightAbstractAnnotation.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolLightAbstractAnnotation.kt @@ -6,13 +6,16 @@ package org.jetbrains.kotlin.light.classes.symbol.annotations import com.intellij.psi.* -import com.intellij.psi.impl.PsiImplUtil +import org.jetbrains.kotlin.analysis.api.calls.singleConstructorCallOrNull +import org.jetbrains.kotlin.analysis.api.calls.symbol import org.jetbrains.kotlin.asJava.classes.cannotModify import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.asJava.elements.KtLightElementBase +import org.jetbrains.kotlin.light.classes.symbol.analyzeForLightClasses import org.jetbrains.kotlin.light.classes.symbol.codeReferences.SymbolLightPsiJavaCodeReferenceElementWithNoReference import org.jetbrains.kotlin.light.classes.symbol.codeReferences.SymbolLightPsiJavaCodeReferenceElementWithReference +import org.jetbrains.kotlin.light.classes.symbol.toAnnotationMemberValue import org.jetbrains.kotlin.psi.* internal abstract class SymbolLightAbstractAnnotation(parent: PsiElement) : @@ -49,10 +52,41 @@ internal abstract class SymbolLightAbstractAnnotation(parent: PsiElement) : override fun setDeclaredAttributeValue(attributeName: String?, value: T?) = cannotModify() - override fun findAttributeValue(attributeName: String?): PsiAnnotationMemberValue? = PsiImplUtil.findAttributeValue(this, attributeName) + private fun getAttributeValue(name: String?, useDefault: Boolean): PsiAnnotationMemberValue? { + val attributeName = name ?: "value" + parameterList.attributes + .find { it.name == attributeName } + ?.let { return it.value } + + if (useDefault) { + val callElement = kotlinOrigin ?: return null + return analyzeForLightClasses(callElement) { + val valueParameter = callElement.resolveCall() + .singleConstructorCallOrNull() + ?.symbol + ?.valueParameters + ?.find { it.name.identifierOrNullIfSpecial == attributeName } + + when (val psi = valueParameter?.psi) { + is KtParameter -> { + psi.defaultValue?.let { defaultValue -> + defaultValue.evaluateAsAnnotationValue()?.toAnnotationMemberValue(parameterList) + } + } + is PsiAnnotationMethod -> psi.defaultValue + else -> null + } + } + } + + return null + } + + override fun findAttributeValue(attributeName: String?): PsiAnnotationMemberValue? = + getAttributeValue(attributeName, true) override fun findDeclaredAttributeValue(attributeName: String?): PsiAnnotationMemberValue? = - PsiImplUtil.findDeclaredAttributeValue(this, attributeName) + getAttributeValue(attributeName, false) override fun accept(visitor: PsiElementVisitor) { if (visitor is JavaElementVisitor) { 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 a27ae583e8f..ce16369608f 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 @@ -76,7 +76,9 @@ class KtLightAnnotationForSourceEntry( if (callEntry.key.declaresOrInheritsDefaultValue()) { when (val psiElement = callEntry.key.source.getPsi()) { is KtParameter -> - return psiElement.defaultValue?.let { convertToLightAnnotationMemberValue(this, it) } + return psiElement.defaultValue?.let { defaultValue -> + convertToLightAnnotationMemberValue(ktLightAnnotationParameterList, defaultValue) + } is PsiAnnotationMethod -> return psiElement.defaultValue