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:
@@ -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)
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
|
||||
+15
-3
@@ -42,13 +42,20 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor
|
||||
import org.jetbrains.kotlin.type.MapPsiToAsmDesc
|
||||
|
||||
interface LightMemberOriginForCompiledElement : LightMemberOrigin {
|
||||
interface LightMemberOriginForCompiledElement<T : PsiMember> : LightMemberOrigin {
|
||||
val member: T
|
||||
|
||||
override val originKind: JvmDeclarationOriginKind
|
||||
get() = JvmDeclarationOriginKind.OTHER
|
||||
|
||||
override fun isValid(): Boolean = member.isValid
|
||||
}
|
||||
|
||||
|
||||
data class LightMemberOriginForCompiledField(val psiField: PsiField, val file: KtClsFile) : LightMemberOriginForCompiledElement {
|
||||
data class LightMemberOriginForCompiledField(val psiField: PsiField, val file: KtClsFile) : LightMemberOriginForCompiledElement<PsiField> {
|
||||
override val member: PsiField
|
||||
get() = psiField
|
||||
|
||||
override fun copy(): LightMemberOrigin {
|
||||
return LightMemberOriginForCompiledField(psiField.copy() as PsiField, file)
|
||||
}
|
||||
@@ -65,7 +72,12 @@ data class LightMemberOriginForCompiledField(val psiField: PsiField, val file: K
|
||||
}
|
||||
}
|
||||
|
||||
data class LightMemberOriginForCompiledMethod(val psiMethod: PsiMethod, val file: KtClsFile) : LightMemberOriginForCompiledElement {
|
||||
data class LightMemberOriginForCompiledMethod(val psiMethod: PsiMethod, val file: KtClsFile) :
|
||||
LightMemberOriginForCompiledElement<PsiMethod> {
|
||||
|
||||
override val member: PsiMethod
|
||||
get() = psiMethod
|
||||
|
||||
override fun isEquivalentTo(other: LightMemberOrigin?): Boolean {
|
||||
if (other !is LightMemberOriginForCompiledMethod) return false
|
||||
return psiMethod.isEquivalentTo(other.psiMethod)
|
||||
|
||||
Reference in New Issue
Block a user