SLC: implement PsiAnnotation#find(Declared)AttributeValue
^KT-58448 Fixed
This commit is contained in:
committed by
Ilya Kirillov
parent
08f3d56d9b
commit
41473a948d
+37
-3
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user