From bc0ccd48615d97c6e3a0a60ecf89727cff4fb687 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 14 Jul 2016 17:12:33 +0300 Subject: [PATCH] Refactor: move script module info related code to a separate file --- .../idea/caches/resolve/IdeaModuleInfos.kt | 99 -------------- .../idea/caches/resolve/ScriptModuleInfos.kt | 124 ++++++++++++++++++ 2 files changed, 124 insertions(+), 99 deletions(-) create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ScriptModuleInfos.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt index 1c1f117f2f2..4cfca1a9b61 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt @@ -19,35 +19,24 @@ package org.jetbrains.kotlin.idea.caches.resolve import com.intellij.openapi.module.Module import com.intellij.openapi.module.impl.scopes.LibraryScopeBase import com.intellij.openapi.project.Project -import com.intellij.openapi.projectRoots.ProjectJdkTable import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.* import com.intellij.openapi.roots.impl.libraries.LibraryEx import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.vfs.VirtualFile -import com.intellij.psi.search.DelegatingGlobalSearchScope import com.intellij.psi.search.GlobalSearchScope -import com.intellij.psi.search.NonClasspathDirectoriesScope import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager import com.intellij.util.SmartList import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.idea.core.script.KotlinScriptConfigurationManager -import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.script.KotlinScriptDefinition -import org.jetbrains.kotlin.script.KotlinScriptExternalDependencies -import org.jetbrains.kotlin.script.KotlinScriptExternalImportsProvider import org.jetbrains.kotlin.utils.alwaysNull import org.jetbrains.kotlin.utils.emptyOrSingletonList -import org.jetbrains.kotlin.utils.singletonOrEmptyList -import java.io.File import java.lang.reflect.Method import java.util.* private val LIBRARY_NAME_PREFIX: String = "library " -private val SCRIPT_NAME_PREFIX: String = "script " // TODO used reflection to be compatible with IDEA from both 143 and 144 branches, // TODO switch to directly using when "since-build" will be >= 144.3357.4 @@ -291,94 +280,6 @@ internal object NotUnderContentRootModuleInfo : IdeaModuleInfo { override fun dependencies(): List = listOf(this) } -class ScriptModuleSearchScope(val scriptFile: VirtualFile, baseScope: GlobalSearchScope) : DelegatingGlobalSearchScope(baseScope) { - override fun equals(other: Any?) = other is ScriptModuleSearchScope && scriptFile == other.scriptFile && super.equals(other) - - override fun hashCode() = scriptFile.hashCode() * 73 * super.hashCode() -} - -data class ScriptModuleInfo(val project: Project, val scriptFile: VirtualFile, - val scriptDefinition: KotlinScriptDefinition) : IdeaModuleInfo { - override val moduleOrigin: ModuleOrigin - get() = ModuleOrigin.OTHER - - val externalDependencies by lazy { - KotlinScriptExternalImportsProvider.getInstance(project)?.getExternalImports(scriptFile)?.makeComparable() - } - - override val name: Name = Name.special("<$SCRIPT_NAME_PREFIX${scriptDefinition.name}>") - - override fun contentScope() = GlobalSearchScope.fileScope(project, scriptFile) - - override fun dependencies(): List { - return listOf( - this, - ScriptDependenciesModuleInfo(project, externalDependencies) - ) + sdkDependencies(externalDependencies, project) - } -} - -private fun sdkDependencies(scriptDependencies: KotlinScriptExternalDependencies?, project: Project): List - = findJdk(scriptDependencies, project)?.let { SdkInfo(project, it) }.singletonOrEmptyList() - -fun findJdk(dependencies: KotlinScriptExternalDependencies?, project: Project): Sdk? { - val jdkTable = ProjectJdkTable.getInstance() - val allJdks = jdkTable.allJdks - // workaround for mismatched gradle wrapper and plugin version - val javaHome = try { dependencies?.javaHome } catch (e: Throwable) { null } - - return allJdks.find { javaHome != null && it.homePath == javaHome } ?: - ProjectRootManager.getInstance(project).projectSdk ?: - allJdks.firstOrNull() -} - -private inline fun tryGet(body: () -> T): T? { - return try { - body() - } - catch (e: Throwable) { - null - } -} - -data class ComparableScriptDependencies( - override val javaHome: String?, - override val classpath: Iterable, - override val imports: Iterable, - override val sources: Iterable, - override val scripts: Iterable -): 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) - - override val name = Name.special("