Add script dependencies modification tracker, some optimizations
This commit is contained in:
+8
-5
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.container.getService
|
||||
import org.jetbrains.kotlin.context.GlobalContext
|
||||
import org.jetbrains.kotlin.context.GlobalContextImpl
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesModificationTracker
|
||||
import org.jetbrains.kotlin.idea.project.AnalyzerFacadeProvider
|
||||
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
|
||||
import org.jetbrains.kotlin.idea.project.outOfBlockModificationCount
|
||||
@@ -52,6 +53,7 @@ import org.jetbrains.kotlin.resolve.TargetPlatform
|
||||
import org.jetbrains.kotlin.resolve.diagnostics.KotlinSuppressCache
|
||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.kotlin.script.KotlinScriptExternalDependencies
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.sumByLong
|
||||
import java.lang.AssertionError
|
||||
@@ -74,14 +76,14 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
|
||||
}
|
||||
|
||||
|
||||
private val facadesForScriptDependencies: SLRUCache<ComparableScriptDependencies, ProjectResolutionFacade> =
|
||||
object : SLRUCache<ComparableScriptDependencies, ProjectResolutionFacade>(2, 3) {
|
||||
override fun createValue(key: ComparableScriptDependencies?): ProjectResolutionFacade {
|
||||
private val facadesForScriptDependencies: SLRUCache<KotlinScriptExternalDependencies, ProjectResolutionFacade> =
|
||||
object : SLRUCache<KotlinScriptExternalDependencies, ProjectResolutionFacade>(2, 3) {
|
||||
override fun createValue(key: KotlinScriptExternalDependencies?): ProjectResolutionFacade {
|
||||
return createFacadeForScriptDependencies(ScriptDependenciesModuleInfo(project, key))
|
||||
}
|
||||
}
|
||||
|
||||
private fun getFacadeForScriptDependencies(dependencies: ComparableScriptDependencies?) = synchronized(facadesForScriptDependencies) {
|
||||
private fun getFacadeForScriptDependencies(dependencies: KotlinScriptExternalDependencies?) = synchronized(facadesForScriptDependencies) {
|
||||
facadesForScriptDependencies.get(dependencies)
|
||||
}
|
||||
|
||||
@@ -105,7 +107,8 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
|
||||
//TODO: provide correct trackers
|
||||
dependencies = listOf(
|
||||
LibraryModificationTracker.getInstance(project),
|
||||
ProjectRootModificationTracker.getInstance(project)
|
||||
ProjectRootModificationTracker.getInstance(project),
|
||||
ScriptDependenciesModificationTracker.getInstance(project)
|
||||
),
|
||||
moduleFilter = { it == dependenciesModuleInfo },
|
||||
syntheticFiles = syntheticFiles
|
||||
|
||||
+3
-26
@@ -17,7 +17,6 @@
|
||||
package org.jetbrains.kotlin.idea.caches.resolve
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.projectRoots.ProjectJdkTable
|
||||
import com.intellij.openapi.projectRoots.Sdk
|
||||
import com.intellij.openapi.roots.ProjectRootManager
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
@@ -31,7 +30,6 @@ import org.jetbrains.kotlin.script.KotlinScriptDefinition
|
||||
import org.jetbrains.kotlin.script.KotlinScriptExternalDependencies
|
||||
import org.jetbrains.kotlin.script.KotlinScriptExternalImportsProvider
|
||||
import org.jetbrains.kotlin.utils.singletonOrEmptyList
|
||||
import java.io.File
|
||||
|
||||
private val SCRIPT_NAME_PREFIX: String = "script "
|
||||
|
||||
@@ -47,7 +45,7 @@ data class ScriptModuleInfo(val project: Project, val scriptFile: VirtualFile,
|
||||
get() = ModuleOrigin.OTHER
|
||||
|
||||
val externalDependencies by lazy {
|
||||
KotlinScriptExternalImportsProvider.getInstance(project)?.getExternalImports(scriptFile)?.makeComparable()
|
||||
KotlinScriptExternalImportsProvider.getInstance(project)?.getExternalImports(scriptFile)
|
||||
}
|
||||
|
||||
override val name: Name = Name.special("<$SCRIPT_NAME_PREFIX${scriptDefinition.name}>")
|
||||
@@ -75,29 +73,8 @@ fun findJdk(dependencies: KotlinScriptExternalDependencies?, project: Project):
|
||||
allJdks.firstOrNull()
|
||||
}
|
||||
|
||||
private inline fun <T> tryGet(body: () -> T): T? {
|
||||
return try {
|
||||
body()
|
||||
}
|
||||
catch (e: Throwable) {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
data class ComparableScriptDependencies(
|
||||
override val javaHome: String?,
|
||||
override val classpath: Iterable<File>,
|
||||
override val imports: Iterable<String>,
|
||||
override val sources: Iterable<File>,
|
||||
override val scripts: Iterable<File>
|
||||
): KotlinScriptExternalDependencies
|
||||
|
||||
fun KotlinScriptExternalDependencies.makeComparable() = ComparableScriptDependencies(
|
||||
tryGet { javaHome }, classpath, imports, sources, tryGet { scripts } ?: listOf()
|
||||
)
|
||||
|
||||
class ScriptDependenciesModuleInfo(val project: Project, val dependencies: ComparableScriptDependencies?): IdeaModuleInfo {
|
||||
override fun dependencies() = listOf(this) + sdkDependencies(dependencies, project)
|
||||
class ScriptDependenciesModuleInfo(val project: Project, val dependencies: KotlinScriptExternalDependencies?): IdeaModuleInfo {
|
||||
override fun dependencies() = (listOf(this) + sdkDependencies(dependencies, project))
|
||||
|
||||
override val name = Name.special("<Script dependencies>")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user