[FIR IDE] LC add caching to light facades

This commit is contained in:
Igor Yakovlev
2020-12-11 21:40:16 +03:00
parent da54dbba8e
commit f5d8ae0550
2 changed files with 33 additions and 2 deletions
@@ -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
@@ -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<KtFile>,
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<KtFile>,
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