diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/caches/resolve/IDEKotlinAsJavaSupport.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/caches/resolve/IDEKotlinAsJavaSupport.kt index 32b6c3d11d9..320201609aa 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/caches/resolve/IDEKotlinAsJavaSupport.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/caches/resolve/IDEKotlinAsJavaSupport.kt @@ -6,25 +6,32 @@ package org.jetbrains.kotlin.idea.caches.resolve import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Key +import com.intellij.openapi.util.UserDataHolder import com.intellij.psi.PsiManager import com.intellij.psi.search.GlobalSearchScope +import com.intellij.psi.util.CachedValueProvider +import com.intellij.psi.util.CachedValuesManager +import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.idea.asJava.FirLightClassForFacade +import org.jetbrains.kotlin.idea.asJava.classes.createFirLightClassNoCache import org.jetbrains.kotlin.idea.asJava.classes.getOrCreateFirLightClass +import org.jetbrains.kotlin.idea.asJava.classes.getOrCreateFirLightFacade import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtScript class IDEKotlinAsJavaFirSupport(project: Project) : IDEKotlinAsJavaSupport(project) { - //TODO Make caching override fun createLightClassForFacade(manager: PsiManager, facadeClassFqName: FqName, searchScope: GlobalSearchScope): KtLightClass? { val sources = findFilesForFacade(facadeClassFqName, searchScope) .filterNot { it.isCompiled } if (sources.isEmpty()) return null - return FirLightClassForFacade(manager, facadeClassFqName, sources) + return getOrCreateFirLightFacade(sources, facadeClassFqName) } override fun createLightClassForScript(script: KtScript): KtLightClass? = null diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt index 9b70a5e70a8..269ab68bf8f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithDeclar import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClass import java.util.* @@ -79,6 +80,29 @@ fun createFirLightClassNoCache(classOrObject: KtClassOrObject): KtLightClass? { } } +fun getOrCreateFirLightFacade( + ktFiles: List, + facadeClassFqName: FqName, +): FirLightClassForFacade? { + val firstFile = ktFiles.firstOrNull() ?: return null + //TODO Make caching keyed by all files + return CachedValuesManager.getCachedValue(firstFile) { + CachedValueProvider.Result + .create( + getOrCreateFirLightFacadeNoCache(ktFiles, facadeClassFqName), + KotlinModificationTrackerService.getInstance(firstFile.project).outOfBlockModificationTracker + ) + } +} + +fun getOrCreateFirLightFacadeNoCache( + ktFiles: List, + facadeClassFqName: FqName, +): FirLightClassForFacade? { + val firstFile = ktFiles.firstOrNull() ?: return null + return FirLightClassForFacade(firstFile.manager, facadeClassFqName, ktFiles) +} + private fun lightClassForEnumEntry(ktEnumEntry: KtEnumEntry): KtLightClass? { if (ktEnumEntry.body == null) return null