From 8fa67f0478dbd07760b9fa9def8953cff995e18b Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Mon, 9 Sep 2019 18:45:59 +0300 Subject: [PATCH] Add correct modification tracking on UltraLight classes Fixed #KT-32820 --- .../classes/KtLightClassForLocalDeclaration.kt | 15 --------------- .../classes/KtLightClassForSourceDeclaration.kt | 6 ++++++ .../kotlin/asJava/classes/implUtils.kt | 17 +++++++++++++---- .../kotlin/asJava/classes/ultraLightClass.kt | 3 +-- 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForLocalDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForLocalDeclaration.kt index 79bc7334724..cbe56fd5ba0 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForLocalDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForLocalDeclaration.kt @@ -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) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt index 97ae5211c52..659ae2f21c7 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt @@ -71,6 +71,12 @@ abstract class KtLightClassForSourceDeclaration( private val forceUsingOldLightClasses: Boolean = false ) : KtLazyLightClass(classOrObject.manager), StubBasedPsiElement> { + + override val myInnersCache: KotlinClassInnerStuffCache = KotlinClassInnerStuffCache( + this, + classOrObject.getExternalDependencies() + ) + private val lightIdentifier = KtLightIdentifier(this, classOrObject) override fun getText() = kotlinOrigin.text ?: "" diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt index 5d2f62ad1da..b0255b0d322 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt @@ -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 { + return with(KotlinModificationTrackerService.getInstance(project)) { + if (!isLocal) return listOf(outOfBlockModificationTracker) + else when (val file = containingFile) { + is KtFile -> listOf(outOfBlockModificationTracker, fileModificationTracker(file)) + else -> listOf(outOfBlockModificationTracker) + } + } } \ No newline at end of file diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt index 664d4287c44..29c5724e273 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt @@ -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 )