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.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtAnnotationEntry
import org.jetbrains.kotlin.psi.KtCallElement
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
@@ -453,7 +454,7 @@ internal fun createKtInitializerValue(
internal fun AnnotationDescriptor.toKtAnnotationApplication(): KtAnnotationApplication { internal fun AnnotationDescriptor.toKtAnnotationApplication(): KtAnnotationApplication {
return KtAnnotationApplication( return KtAnnotationApplication(
annotationClass?.maybeLocalClassId, annotationClass?.maybeLocalClassId,
(source as? PsiSourceElement)?.psi as? KtAnnotationEntry, (source as? PsiSourceElement)?.psi as? KtCallElement,
(this as? LazyAnnotationDescriptor)?.annotationEntry?.useSiteTarget?.getAnnotationUseSiteTarget(), (this as? LazyAnnotationDescriptor)?.annotationEntry?.useSiteTarget?.getAnnotationUseSiteTarget(),
getKtNamedAnnotationArguments(), getKtNamedAnnotationArguments(),
) )
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtAnnotationEntry
import org.jetbrains.kotlin.psi.KtCallElement
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
/** /**
@@ -76,7 +77,7 @@ internal fun ConeDiagnostic.getCandidateSymbols(): Collection<FirBasedSymbol<*>>
internal fun FirAnnotation.toKtAnnotationApplication(useSiteSession: FirSession): KtAnnotationApplication { internal fun FirAnnotation.toKtAnnotationApplication(useSiteSession: FirSession): KtAnnotationApplication {
return KtAnnotationApplication( return KtAnnotationApplication(
fullyExpandedClassId(useSiteSession), fullyExpandedClassId(useSiteSession),
psi as? KtAnnotationEntry, psi as? KtCallElement,
useSiteTarget, useSiteTarget,
FirAnnotationValueConverter.toNamedConstantValue( FirAnnotationValueConverter.toNamedConstantValue(
mapAnnotationParameters(this, useSiteSession), mapAnnotationParameters(this, useSiteSession),
@@ -108,7 +108,7 @@ internal object FirAnnotationValueConverter {
KtAnnotationApplicationValue( KtAnnotationApplicationValue(
KtAnnotationApplication( KtAnnotationApplication(
resolvedSymbol.callableId.classId, resolvedSymbol.callableId.classId,
psi as? KtAnnotationEntry, psi as? KtCallElement,
useSiteTarget = null, useSiteTarget = null,
toNamedConstantValue(resultMap, session), 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` * 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. * [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 * [KtAnnotationApplicationValue] represents annotation types (with annotation fq name and arguments); and
* [KtArrayAnnotationValue] abstracts an array of [KtAnnotationValue]s. * [KtArrayAnnotationValue] abstracts an array of [KtAnnotationValue]s.
*/ */
public sealed class KtAnnotationValue( public sealed class KtAnnotationValue {
public open val sourcePsi: KtElement? = null public abstract val sourcePsi: KtElement?
) }
/** /**
* This represents an unsupported expression used as an annotation value. * 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])` * Array of annotation values. E.g: `@A([1, 2])`
@@ -116,7 +118,9 @@ public class KtEnumEntryAnnotationValue(
*/ */
public class KtConstantAnnotationValue( public class KtConstantAnnotationValue(
public val constantValue: KtConstantValue, public val constantValue: KtConstantValue,
) : KtAnnotationValue() ) : KtAnnotationValue() {
override val sourcePsi: KtElement? get() = constantValue.sourcePsi
}
/** /**