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.impl.light.LightClass
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.toLightClass
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
open class KtLightClassForLocalDeclaration(
classOrObject: KtClassOrObject
) : 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)
@@ -71,6 +71,12 @@ abstract class KtLightClassForSourceDeclaration(
private val forceUsingOldLightClasses: Boolean = false
) : KtLazyLightClass(classOrObject.manager),
StubBasedPsiElement<KotlinClassOrObjectStub<out KtClassOrObject>> {
override val myInnersCache: KotlinClassInnerStuffCache = KotlinClassInnerStuffCache(
this,
classOrObject.getExternalDependencies()
)
private val lightIdentifier = KtLightIdentifier(this, classOrObject)
override fun getText() = kotlinOrigin.text ?: ""
@@ -5,15 +5,14 @@
package org.jetbrains.kotlin.asJava.classes
import com.intellij.openapi.util.ModificationTracker
import com.intellij.psi.PsiJavaCodeReferenceElement
import com.intellij.psi.PsiReferenceList
import com.intellij.psi.impl.light.LightElement
import com.intellij.util.IncorrectOperationException
import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.kotlin.psi.KtSuperTypeList
import org.jetbrains.kotlin.psi.KtSuperTypeListEntry
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
@@ -49,4 +48,14 @@ fun PsiReferenceList.addSuperTypeEntry(
// Preserve original entry order
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.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService
import org.jetbrains.kotlin.asJava.builder.LightClassData
import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
@@ -302,7 +301,7 @@ open class KtUltraLightClass(classOrObject: KtClassOrObject, internal val suppor
{
CachedValueProvider.Result.create(
ownMethods(),
KotlinModificationTrackerService.getInstance(project).outOfBlockModificationTracker
classOrObject.getExternalDependencies()
)
}, false
)