Uast: fixing WrappedUAnnotation identifiers

This commit is contained in:
Nicolay Mitropolsky
2020-07-30 21:18:49 +03:00
committed by Igor Yakovlev
parent 4b8f1bb362
commit e53db4c771
3 changed files with 21 additions and 9 deletions
@@ -25,7 +25,7 @@ class KtLightPsiJavaCodeReferenceElement(
override fun advancedResolve(incompleteCode: Boolean): JavaResolveResult =
delegate?.advancedResolve(incompleteCode) ?: JavaResolveResult.EMPTY
override fun getReferenceNameElement(): PsiElement? = ktElement
override fun getReferenceNameElement(): PsiElement? = delegate?.referenceNameElement
override fun getTypeParameters(): Array<PsiType> = delegate?.typeParameters ?: emptyArray()
@@ -22,6 +22,7 @@ import com.intellij.psi.util.PsiTypesUtil
import org.jetbrains.annotations.NotNull
import org.jetbrains.annotations.Nullable
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.elements.KtLightAbstractAnnotation
import org.jetbrains.kotlin.asJava.elements.KtLightElement
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.psi.*
@@ -31,6 +32,7 @@ import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.typeUtil.TypeNullability
import org.jetbrains.kotlin.types.typeUtil.nullability
import org.jetbrains.kotlin.utils.SmartList
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import org.jetbrains.uast.*
import org.jetbrains.uast.internal.acceptList
import org.jetbrains.uast.kotlin.declarations.KotlinUIdentifier
@@ -123,13 +125,19 @@ abstract class AbstractKotlinUVariable(givenParent: UElement?) : KotlinAbstractU
override val javaPsi: PsiAnnotation = psiAnnotation
override val psi: PsiAnnotation = javaPsi
override val sourcePsi: PsiElement? = null
override val sourcePsi: PsiElement? = psiAnnotation.safeAs<KtLightAbstractAnnotation>()?.kotlinOrigin
override val attributeValues: List<UNamedExpression> by lz {
psi.parameterList.attributes.map { WrappedUNamedExpression(it, this) }
}
override val uastAnchor by lazy { KotlinUIdentifier(javaPsi.nameReferenceElement?.referenceNameElement, null, this) }
override val uastAnchor by lazy {
KotlinUIdentifier(
{ javaPsi.nameReferenceElement?.referenceNameElement },
sourcePsi.safeAs<KtAnnotationEntry>()?.typeReference?.nameElement,
this
)
}
class WrappedUNamedExpression(pair: PsiNameValuePair, override val uastParent: UElement?) : UNamedExpression {
override val name: String? = pair.name
@@ -34,12 +34,16 @@ class UastLightIdentifier(lightOwner: PsiNameIdentifierOwner, ktDeclaration: KtD
override fun getContainingFile(): PsiFile = unwrapFakeFileForLightClass(super.getContainingFile())
}
class KotlinUIdentifier private constructor(
override val javaPsi: PsiElement?,
class KotlinUIdentifier constructor(
javaPsiSupplier: () -> PsiElement?,
override val sourcePsi: PsiElement?,
override val psi: PsiElement?,
givenParent: UElement?
) : UIdentifier(psi, givenParent) {
) : UIdentifier(sourcePsi, givenParent) {
override val javaPsi: PsiElement? by lazy(javaPsiSupplier) // don't know any real need to call it in production
override val psi: PsiElement?
get() = javaPsi ?: sourcePsi
init {
if (ApplicationManager.getApplication().isUnitTestMode && !acceptableSourcePsi(sourcePsi))
@@ -72,6 +76,6 @@ class KotlinUIdentifier private constructor(
return null
}
constructor(javaPsi: PsiElement?, sourcePsi: PsiElement?, uastParent: UElement?) : this(javaPsi, sourcePsi, javaPsi, uastParent)
constructor(sourcePsi: PsiElement?, uastParent: UElement?) : this(null, sourcePsi, sourcePsi, uastParent)
constructor(javaPsi: PsiElement?, sourcePsi: PsiElement?, uastParent: UElement?) : this({ javaPsi }, sourcePsi, uastParent)
constructor(sourcePsi: PsiElement?, uastParent: UElement?) : this({ null }, sourcePsi, uastParent)
}