[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
|
package org.jetbrains.kotlin.idea.caches.resolve
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
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.PsiManager
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
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.asJava.classes.KtLightClass
|
||||||
import org.jetbrains.kotlin.idea.asJava.FirLightClassForFacade
|
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.getOrCreateFirLightClass
|
||||||
|
import org.jetbrains.kotlin.idea.asJava.classes.getOrCreateFirLightFacade
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.psi.KtScript
|
import org.jetbrains.kotlin.psi.KtScript
|
||||||
|
|
||||||
class IDEKotlinAsJavaFirSupport(project: Project) : IDEKotlinAsJavaSupport(project) {
|
class IDEKotlinAsJavaFirSupport(project: Project) : IDEKotlinAsJavaSupport(project) {
|
||||||
|
|
||||||
//TODO Make caching
|
|
||||||
override fun createLightClassForFacade(manager: PsiManager, facadeClassFqName: FqName, searchScope: GlobalSearchScope): KtLightClass? {
|
override fun createLightClassForFacade(manager: PsiManager, facadeClassFqName: FqName, searchScope: GlobalSearchScope): KtLightClass? {
|
||||||
val sources = findFilesForFacade(facadeClassFqName, searchScope)
|
val sources = findFilesForFacade(facadeClassFqName, searchScope)
|
||||||
.filterNot { it.isCompiled }
|
.filterNot { it.isCompiled }
|
||||||
|
|
||||||
if (sources.isEmpty()) return null
|
if (sources.isEmpty()) return null
|
||||||
|
|
||||||
return FirLightClassForFacade(manager, facadeClassFqName, sources)
|
return getOrCreateFirLightFacade(sources, facadeClassFqName)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createLightClassForScript(script: KtScript): KtLightClass? = null
|
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.KtClassType
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.containingClass
|
import org.jetbrains.kotlin.psi.psiUtil.containingClass
|
||||||
import java.util.*
|
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? {
|
private fun lightClassForEnumEntry(ktEnumEntry: KtEnumEntry): KtLightClass? {
|
||||||
if (ktEnumEntry.body == null) return null
|
if (ktEnumEntry.body == null) return null
|
||||||
|
|||||||
Reference in New Issue
Block a user