Analysis API: fix invalid psi elements for constants and annotation values

This commit is contained in:
Ilya Kirillov
2021-12-02 15:36:29 +01:00
parent dc9c2aa39d
commit 7440c726d0
5 changed files with 15 additions and 9 deletions
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtAnnotationEntry
import org.jetbrains.kotlin.psi.KtCallElement
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.resolve.DescriptorUtils
@@ -453,7 +454,7 @@ internal fun createKtInitializerValue(
internal fun AnnotationDescriptor.toKtAnnotationApplication(): KtAnnotationApplication {
return KtAnnotationApplication(
annotationClass?.maybeLocalClassId,
(source as? PsiSourceElement)?.psi as? KtAnnotationEntry,
(source as? PsiSourceElement)?.psi as? KtCallElement,
(this as? LazyAnnotationDescriptor)?.annotationEntry?.useSiteTarget?.getAnnotationUseSiteTarget(),
getKtNamedAnnotationArguments(),
)
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.psi.KtAnnotationEntry
import org.jetbrains.kotlin.psi.KtCallElement
import org.jetbrains.kotlin.util.OperatorNameConventions
/**
@@ -76,7 +77,7 @@ internal fun ConeDiagnostic.getCandidateSymbols(): Collection<FirBasedSymbol<*>>
internal fun FirAnnotation.toKtAnnotationApplication(useSiteSession: FirSession): KtAnnotationApplication {
return KtAnnotationApplication(
fullyExpandedClassId(useSiteSession),
psi as? KtAnnotationEntry,
psi as? KtCallElement,
useSiteTarget,
FirAnnotationValueConverter.toNamedConstantValue(
mapAnnotationParameters(this, useSiteSession),
@@ -108,7 +108,7 @@ internal object FirAnnotationValueConverter {
KtAnnotationApplicationValue(
KtAnnotationApplication(
resolvedSymbol.callableId.classId,
psi as? KtAnnotationEntry,
psi as? KtCallElement,
useSiteTarget = null,
toNamedConstantValue(resultMap, session),
)
@@ -29,7 +29,7 @@ public data class KtAnnotationApplication(
*
* Present only for declarations from sources. For declarations from other places (libraries, stdlib) it's `null`
*/
public val psi: KtAnnotationEntry?,
public val psi: KtCallElement?,
/**
* [AnnotationUseSiteTarget] to which annotation was applied. May be not-null only for annotation applications for declarations.
@@ -26,15 +26,17 @@ import org.jetbrains.kotlin.psi.KtElement
* [KtAnnotationApplicationValue] represents annotation types (with annotation fq name and arguments); and
* [KtArrayAnnotationValue] abstracts an array of [KtAnnotationValue]s.
*/
public sealed class KtAnnotationValue(
public open val sourcePsi: KtElement? = null
)
public sealed class KtAnnotationValue {
public abstract val sourcePsi: KtElement?
}
/**
* This represents an unsupported expression used as an annotation value.
*/
public object KtUnsupportedAnnotationValue : KtAnnotationValue()
public object KtUnsupportedAnnotationValue : KtAnnotationValue() {
override val sourcePsi: KtElement? get() = null
}
/**
* Array of annotation values. E.g: `@A([1, 2])`
@@ -116,7 +118,9 @@ public class KtEnumEntryAnnotationValue(
*/
public class KtConstantAnnotationValue(
public val constantValue: KtConstantValue,
) : KtAnnotationValue()
) : KtAnnotationValue() {
override val sourcePsi: KtElement? get() = constantValue.sourcePsi
}
/**