[FIR IDE] LC add caching to light facades
This commit is contained in:
+9
-2
@@ -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
|
||||
|
||||
+24
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user