提交 f5d8ae05 编写于 作者: I Igor Yakovlev

[FIR IDE] LC add caching to light facades

上级 da54dbba
...@@ -6,25 +6,32 @@ ...@@ -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
......
...@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithDeclar ...@@ -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? { ...@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册