Analysis API: introduce annotation value for KClass

This commit is contained in:
Ilya Kirillov
2021-11-24 12:38:03 +01:00
parent f722a54c78
commit 673459580c
16 changed files with 86 additions and 17 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.light.classes.symbol
import com.intellij.psi.*
import com.intellij.psi.util.TypeConversionUtil
import com.intellij.util.IncorrectOperationException
import org.jetbrains.kotlin.asJava.elements.KtLightElement
import org.jetbrains.kotlin.asJava.elements.KtLightMember
@@ -20,8 +21,10 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.*
import org.jetbrains.kotlin.analysis.api.types.*
import org.jetbrains.kotlin.asJava.elements.psiType
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.resolve.constants.KClassValue
import java.util.*
internal fun <L : Any> L.invalidAccess(): Nothing =
@@ -199,6 +202,21 @@ internal fun KtAnnotationValue.toAnnotationMemberValue(parent: PsiElement): PsiA
FirPsiExpression(sourcePsi, parent, psiExpression)
}
KtUnsupportedAnnotationValue -> null
is KtErrorClassAnnotationValue -> null
is KtLocalKClassAnnotationValue -> null
is KtNonLocalKClassAnnotationValue -> toAnnotationMemberValue(parent)
}
}
private fun KtNonLocalKClassAnnotationValue.toAnnotationMemberValue(parent: PsiElement): PsiExpression? {
val fqName = classId.asSingleFqName()
val canonicalText = psiType(
fqName.asString(), parent, boxPrimitiveType = false /* TODO value.arrayNestedness > 0*/,
).let(TypeConversionUtil::erasure).getCanonicalText(false)
return try {
PsiElementFactory.getInstance(parent.project).createExpressionFromText("$canonicalText.class", parent)
} catch (_: IncorrectOperationException) {
null
}
}
@@ -220,4 +238,5 @@ internal fun KtConstantValue.createPsiLiteral(parent: PsiElement): PsiExpression
}
}
internal fun BitSet.copy(): BitSet = clone() as BitSet