SLC: implement PsiAnnotation#find(Declared)AttributeValue

^KT-58448 Fixed
This commit is contained in:
Jinseong Jeon
2023-05-04 22:41:38 -07:00
committed by Ilya Kirillov
parent 08f3d56d9b
commit 41473a948d
2 changed files with 40 additions and 4 deletions
@@ -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 <T : PsiAnnotationMemberValue?> 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) {
@@ -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