Better validity check for kotlin light element

There're exceptions from `isWritable` method in light classes caused by
accessing invalid elements.

Override KtLightMemberImpl implementation to avoid activating
decompiler during validity check.
This commit is contained in:
Nikolay Krasko
2019-06-18 13:42:29 +03:00
parent 60c4eb68ff
commit 353ca9752f
4 changed files with 23 additions and 4 deletions
@@ -53,6 +53,7 @@ interface LightMemberOrigin : LightElementOrigin {
val parametersForJvmOverloads: List<KtParameter?>? get() = null
val auxiliaryOriginalElement: KtDeclaration? get() = null
fun isValid(): Boolean
fun isEquivalentTo(other: LightMemberOrigin?): Boolean
fun copy(): LightMemberOrigin
}
@@ -63,6 +64,8 @@ data class LightMemberOriginForDeclaration(
override val parametersForJvmOverloads: List<KtParameter?>? = null,
override val auxiliaryOriginalElement: KtDeclaration? = null
) : LightMemberOrigin {
override fun isValid(): Boolean = originalElement.isValid
override fun isEquivalentTo(other: LightMemberOrigin?): Boolean {
if (other !is LightMemberOriginForDeclaration) return false
return originalElement.isEquivalentTo(other.originalElement)
@@ -38,7 +38,7 @@ abstract class KtLightElementBase(private val parent: PsiElement): LightElement(
override fun getUseScope() = kotlinOrigin?.useScope ?: super.getUseScope()
override fun getContainingFile() = parent.containingFile
override fun getPresentation() = (kotlinOrigin ?: this).let { ItemPresentationProviders.getItemPresentation(it) }
override fun isValid() = parent.isValid
override fun isValid() = parent.isValid && (kotlinOrigin?.isValid != false)
override fun findElementAt(offset: Int) = kotlinOrigin?.findElementAt(offset)
override fun isEquivalentTo(another: PsiElement?): Boolean =
super.isEquivalentTo(another) || kotlinOrigin?.isEquivalentTo(another) == true
@@ -65,6 +65,10 @@ abstract class KtLightMemberImpl<out D : PsiMember>(
override fun isDeprecated() = (clsDelegate as PsiDocCommentOwner).isDeprecated
override fun isValid(): Boolean {
return parent.isValid && lightMemberOrigin?.isValid() != false
}
override fun isEquivalentTo(another: PsiElement?): Boolean {
if (lightMemberOrigin?.originalElement?.isEquivalentTo(another) == true) return true