Add script dependencies modification tracker, some optimizations

This commit is contained in:
Ilya Chernikov
2016-10-26 15:29:27 +02:00
parent 3382ab3d9c
commit 2e03a6f1fd
7 changed files with 95 additions and 44 deletions
@@ -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
@@ -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>")