Add correct modification tracking on UltraLight classes

Fixed #KT-32820
This commit is contained in:
Igor Yakovlev
2019-09-09 18:45:59 +03:00
parent b2002d56bd
commit 8fa67f0478
4 changed files with 20 additions and 21 deletions
@@ -10,30 +10,15 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod import com.intellij.psi.PsiMethod
import com.intellij.psi.impl.light.LightClass import com.intellij.psi.impl.light.LightClass
import com.intellij.psi.impl.light.LightMethod import com.intellij.psi.impl.light.LightMethod
import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
open class KtLightClassForLocalDeclaration( open class KtLightClassForLocalDeclaration(
classOrObject: KtClassOrObject classOrObject: KtClassOrObject
) : KtLightClassForSourceDeclaration(classOrObject) { ) : KtLightClassForSourceDeclaration(classOrObject) {
override val myInnersCache: KotlinClassInnerStuffCache =
KotlinClassInnerStuffCache(
this,
with(KotlinModificationTrackerService.getInstance(classOrObject.project)) {
val file = classOrObject.containingFile
if (file is KtFile) {
listOf(outOfBlockModificationTracker, fileModificationTracker(file))
} else {
listOf(outOfBlockModificationTracker)
}
}
)
override fun copy(): PsiElement = KtLightClassForLocalDeclaration(classOrObject.copy() as KtClassOrObject) override fun copy(): PsiElement = KtLightClassForLocalDeclaration(classOrObject.copy() as KtClassOrObject)
@@ -71,6 +71,12 @@ abstract class KtLightClassForSourceDeclaration(
private val forceUsingOldLightClasses: Boolean = false private val forceUsingOldLightClasses: Boolean = false
) : KtLazyLightClass(classOrObject.manager), ) : KtLazyLightClass(classOrObject.manager),
StubBasedPsiElement<KotlinClassOrObjectStub<out KtClassOrObject>> { StubBasedPsiElement<KotlinClassOrObjectStub<out KtClassOrObject>> {
override val myInnersCache: KotlinClassInnerStuffCache = KotlinClassInnerStuffCache(
this,
classOrObject.getExternalDependencies()
)
private val lightIdentifier = KtLightIdentifier(this, classOrObject) private val lightIdentifier = KtLightIdentifier(this, classOrObject)
override fun getText() = kotlinOrigin.text ?: "" override fun getText() = kotlinOrigin.text ?: ""
@@ -5,15 +5,14 @@
package org.jetbrains.kotlin.asJava.classes package org.jetbrains.kotlin.asJava.classes
import com.intellij.openapi.util.ModificationTracker
import com.intellij.psi.PsiJavaCodeReferenceElement import com.intellij.psi.PsiJavaCodeReferenceElement
import com.intellij.psi.PsiReferenceList import com.intellij.psi.PsiReferenceList
import com.intellij.psi.impl.light.LightElement import com.intellij.psi.impl.light.LightElement
import com.intellij.util.IncorrectOperationException import com.intellij.util.IncorrectOperationException
import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.kotlin.psi.KtSuperTypeList
import org.jetbrains.kotlin.psi.KtSuperTypeListEntry
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
@@ -49,4 +48,14 @@ fun PsiReferenceList.addSuperTypeEntry(
// Preserve original entry order // Preserve original entry order
entry.replace(entryToAdd) entry.replace(entryToAdd)
} }
}
internal fun KtClassOrObject.getExternalDependencies(): List<ModificationTracker> {
return with(KotlinModificationTrackerService.getInstance(project)) {
if (!isLocal) return listOf(outOfBlockModificationTracker)
else when (val file = containingFile) {
is KtFile -> listOf(outOfBlockModificationTracker, fileModificationTracker(file))
else -> listOf(outOfBlockModificationTracker)
}
}
} }
@@ -14,7 +14,6 @@ import com.intellij.psi.impl.light.LightMethodBuilder
import com.intellij.psi.util.CachedValue import com.intellij.psi.util.CachedValue
import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager import com.intellij.psi.util.CachedValuesManager
import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService
import org.jetbrains.kotlin.asJava.builder.LightClassData import org.jetbrains.kotlin.asJava.builder.LightClassData
import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.KtLightMethod
@@ -302,7 +301,7 @@ open class KtUltraLightClass(classOrObject: KtClassOrObject, internal val suppor
{ {
CachedValueProvider.Result.create( CachedValueProvider.Result.create(
ownMethods(), ownMethods(),
KotlinModificationTrackerService.getInstance(project).outOfBlockModificationTracker classOrObject.getExternalDependencies()
) )
}, false }, false
) )