From f71269009ad209e883a59e44ddfddabb00f71d97 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Fri, 20 Jul 2018 16:22:49 +0300 Subject: [PATCH] Refactoring: use KtScript.scriptDefinition instead of KotlinScriptDefinitionProvider.findScriptDefinition if possible --- .../script/CliScriptDependenciesProvider.kt | 5 ++- .../cli/jvm/compiler/KotlinCoreEnvironment.kt | 2 +- .../lazy/descriptors/LazyScriptDescriptor.kt | 4 +-- .../script/KotlinScriptDefinitionProvider.kt | 28 ++++++++++----- .../idea/caches/project/getModuleInfo.kt | 35 +++++++++---------- .../highlighter/KotlinHighlightingUtil.kt | 4 +-- .../core/script/ScriptDependenciesManager.kt | 7 ++-- .../core/script/ScriptDependenciesUpdater.kt | 11 +++--- .../KotlinScriptResolveScopeProvider.kt | 4 +-- 9 files changed, 51 insertions(+), 49 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/script/CliScriptDependenciesProvider.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/script/CliScriptDependenciesProvider.kt index 4f1e25fed12..05c9099d21f 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/script/CliScriptDependenciesProvider.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/script/CliScriptDependenciesProvider.kt @@ -28,8 +28,7 @@ import kotlin.concurrent.write import kotlin.script.experimental.dependencies.ScriptDependencies class CliScriptDependenciesProvider( - private val project: Project, - private val scriptDefinitionProvider: ScriptDefinitionProvider + private val project: Project ) : ScriptDependenciesProvider { private val cacheLock = ReentrantReadWriteLock() @@ -45,7 +44,7 @@ class CliScriptDependenciesProvider( val cached = cache[path] return if (cached != null) cached else { - val scriptDef = scriptDefinitionProvider.findScriptDefinition(file) + val scriptDef = findScriptDefinition(file, project) if (scriptDef != null) { val result = scriptContentLoader.loadContentsAndResolveDependencies(scriptDef, file) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index 165df941a5a..8fb6f8c4afa 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -603,7 +603,7 @@ class KotlinCoreEnvironment private constructor( registerService(ScriptDefinitionProvider::class.java, scriptDefinitionProvider) registerService( ScriptDependenciesProvider::class.java, - CliScriptDependenciesProvider(projectEnvironment.project, scriptDefinitionProvider) + CliScriptDependenciesProvider(projectEnvironment.project) ) registerService(KotlinJavaPsiFacade::class.java, KotlinJavaPsiFacade(this)) registerService(KtLightClassForFacade.FacadeStubCache::class.java, KtLightClassForFacade.FacadeStubCache(this)) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt index 01aebe33a6d..787806990ba 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt @@ -38,7 +38,7 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind import org.jetbrains.kotlin.resolve.source.toSourceElement import org.jetbrains.kotlin.script.KotlinScriptDefinition import org.jetbrains.kotlin.script.ScriptPriorities -import org.jetbrains.kotlin.script.getScriptDefinition +import org.jetbrains.kotlin.script.findScriptDefinition import org.jetbrains.kotlin.types.TypeSubstitutor import kotlin.reflect.KClass import kotlin.reflect.KType @@ -69,7 +69,7 @@ class LazyScriptDescriptor( val scriptDefinition: () -> KotlinScriptDefinition = resolveSession.storageManager.createLazyValue { val file = scriptInfo.script.containingKtFile - getScriptDefinition(file) ?: throw RuntimeException("file ${file.name} is not a script") + findScriptDefinition(file) ?: throw RuntimeException("file ${file.name} is not a script") } override fun substitute(substitutor: TypeSubstitutor) = this diff --git a/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt b/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt index b91e4f91b63..f24769618fc 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt @@ -16,12 +16,15 @@ package org.jetbrains.kotlin.script +import com.intellij.ide.highlighter.JavaClassFileType import com.intellij.ide.highlighter.JavaFileType import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiFile +import com.intellij.psi.PsiManager import org.jetbrains.kotlin.idea.KotlinFileType +import org.jetbrains.kotlin.psi.KtFile import java.util.concurrent.locks.ReentrantReadWriteLock import kotlin.concurrent.read import kotlin.concurrent.write @@ -37,18 +40,25 @@ interface ScriptDefinitionProvider { } } -fun ScriptDefinitionProvider.findScriptDefinition(file: VirtualFile): KotlinScriptDefinition? = - if (file.isDirectory) null - else findScriptDefinition(file.name) +fun findScriptDefinition(file: VirtualFile, project: Project): KotlinScriptDefinition? { + if (file.isDirectory) return null + if (file.extension == KotlinFileType.EXTENSION || file.extension == JavaClassFileType.INSTANCE.defaultExtension) return null + val psiFile = PsiManager.getInstance(project).findFile(file) + if (psiFile != null) { + if (psiFile !is KtFile || !psiFile.isScript()) { + return null + } + return psiFile.script?.kotlinScriptDefinition?.value + } -fun getScriptDefinition(file: VirtualFile, project: Project): KotlinScriptDefinition? = - if (file.isDirectory) null - else ScriptDefinitionProvider.getInstance(project).findScriptDefinition(file) + return ScriptDefinitionProvider.getInstance(project).findScriptDefinition(file.name) +} -fun getScriptDefinition(psiFile: PsiFile): KotlinScriptDefinition? = - if (psiFile.isDirectory) null - else ScriptDefinitionProvider.getInstance(psiFile.project).findScriptDefinition(psiFile.name) +fun findScriptDefinition(psiFile: PsiFile): KotlinScriptDefinition? { + if (psiFile.isDirectory) return null + return (psiFile as? KtFile)?.script?.kotlinScriptDefinition?.value +} abstract class LazyScriptDefinitionProvider : ScriptDefinitionProvider { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/getModuleInfo.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/getModuleInfo.kt index 73c5856da8e..878b0f19478 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/getModuleInfo.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/getModuleInfo.kt @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.idea.util.isInSourceContentWithoutInjected import org.jetbrains.kotlin.idea.util.isKotlinBinary import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getParentOfType -import org.jetbrains.kotlin.script.getScriptDefinition +import org.jetbrains.kotlin.script.findScriptDefinition import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.sure import org.jetbrains.kotlin.utils.yieldIfNotNull @@ -75,7 +75,7 @@ fun getScriptRelatedModuleInfo(project: Project, virtualFile: VirtualFile): Modu return null } -private typealias VirtualFileProcessor = (Project, VirtualFile, Boolean, Boolean) -> T +private typealias VirtualFileProcessor = (Project, VirtualFile, Boolean) -> T private sealed class ModuleInfoCollector( val onResult: (IdeaModuleInfo?) -> T, @@ -88,12 +88,11 @@ private sealed class ModuleInfoCollector( LOG.error("Could not find correct module information.\nReason: $reason") NotUnderContentRootModuleInfo }, - virtualFileProcessor = processor@ { project, virtualFile, isLibrarySource, isScript -> + virtualFileProcessor = processor@ { project, virtualFile, isLibrarySource -> collectInfosByVirtualFile( project, virtualFile, isLibrarySource, - isScript, { return@processor it ?: NotUnderContentRootModuleInfo }) @@ -106,12 +105,11 @@ private sealed class ModuleInfoCollector( LOG.warn("Could not find correct module information.\nReason: $reason") null }, - virtualFileProcessor = processor@ { project, virtualFile, isLibrarySource, isScript -> + virtualFileProcessor = processor@ { project, virtualFile, isLibrarySource -> collectInfosByVirtualFile( project, virtualFile, isLibrarySource, - isScript, { return@processor it }) } ) @@ -122,13 +120,12 @@ private sealed class ModuleInfoCollector( LOG.warn("Could not find correct module information.\nReason: $reason") emptySequence() }, - virtualFileProcessor = { project, virtualFile, isLibrarySource, isScript -> + virtualFileProcessor = { project, virtualFile, isLibrarySource -> buildSequence { collectInfosByVirtualFile( project, virtualFile, isLibrarySource, - isScript, { yieldIfNotNull(it) }) } } @@ -170,11 +167,19 @@ private fun PsiElement.collectInfos(c: ModuleInfoCollector): T { val virtualFile = containingFile.originalFile.virtualFile ?: return c.onFailure("Analyzing element of type ${this::class.java} in non-physical file $containingFile of type ${containingFile::class.java}\nText:\n$text") + if (containingKtFile?.isScript() == true) { + getModuleRelatedModuleInfo(ProjectFileIndex.SERVICE.getInstance(project), virtualFile)?.let { + return c.onResult(it) + } + findScriptDefinition(virtualFile, project)?.let { + return c.onResult(ScriptModuleInfo(project, virtualFile, it)) + } + } + return c.virtualFileProcessor( project, virtualFile, - (containingFile as? KtFile)?.isCompiled ?: false, - containingKtFile?.isScript() ?: false + (containingFile as? KtFile)?.isCompiled ?: false ) } @@ -184,8 +189,7 @@ private fun KtLightElement<*, *>.processLightElement(c: ModuleInfoCollector< return c.virtualFileProcessor( project, containingFile.virtualFile.sure { "Decompiled class should be build from physical file" }, - false, - (containingFile as? KtFile)?.isScript() ?: false + false ) } @@ -202,7 +206,6 @@ private inline fun collectInfosByVirtualFile( project: Project, virtualFile: VirtualFile, treatAsLibrarySource: Boolean, - isScript: Boolean = getScriptDefinition(virtualFile, project) != null, onOccurrence: (IdeaModuleInfo?) -> T ): T { @@ -213,12 +216,6 @@ private inline fun collectInfosByVirtualFile( onOccurrence(moduleRelatedModuleInfo) } - if (moduleRelatedModuleInfo == null && isScript) { - getScriptDefinition(virtualFile, project)?.let { - onOccurrence(ScriptModuleInfo(project, virtualFile, it)) - } - } - projectFileIndex.getOrderEntriesForFile(virtualFile).forEach { it.toIdeaModuleInfo(project, virtualFile, treatAsLibrarySource)?.let(onOccurrence) } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinHighlightingUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinHighlightingUtil.kt index 718bd2b6c0d..7cae883d552 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinHighlightingUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinHighlightingUtil.kt @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.idea.core.script.scriptDependencies import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.psi.KtCodeFragment import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.script.getScriptDefinition +import org.jetbrains.kotlin.script.findScriptDefinition import kotlin.script.experimental.dependencies.ScriptReport object KotlinHighlightingUtil { @@ -67,7 +67,7 @@ object KotlinHighlightingUtil { return false } - val scriptDefinition = getScriptDefinition(ktFile) ?: return false + val scriptDefinition = findScriptDefinition(ktFile) ?: return false return ScriptDefinitionsManager.getInstance(ktFile.project).isInExpectedLocation(ktFile, scriptDefinition) } } \ No newline at end of file diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesManager.kt index 5e8dac0e8a9..4c244809da0 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesManager.kt @@ -24,7 +24,6 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.util.io.URLUtil import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.idea.core.script.dependencies.SyncScriptDependenciesLoader -import org.jetbrains.kotlin.script.ScriptDefinitionProvider import org.jetbrains.kotlin.script.ScriptDependenciesProvider import org.jetbrains.kotlin.script.findScriptDefinition import java.io.File @@ -77,10 +76,8 @@ class ScriptDependenciesManager internal constructor( @TestOnly fun updateScriptDependenciesSynchronously(virtualFile: VirtualFile, project: Project) { - with(getInstance(project)) { - val scriptDefinition = ScriptDefinitionProvider.getInstance(project).findScriptDefinition(virtualFile)!! - SyncScriptDependenciesLoader(virtualFile, scriptDefinition, project, shouldNotifyRootsChanged = true).updateDependencies() - } + val scriptDefinition = findScriptDefinition(virtualFile, project)!! + SyncScriptDependenciesLoader(virtualFile, scriptDefinition, project, shouldNotifyRootsChanged = true).updateDependencies() } } } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt index 175d520acc7..099e7669ad5 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt @@ -36,14 +36,12 @@ import org.jetbrains.kotlin.idea.core.script.dependencies.FromFileAttributeScrip import org.jetbrains.kotlin.idea.core.script.dependencies.ScriptDependenciesLoader import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.NotNullableUserDataProperty -import org.jetbrains.kotlin.script.ScriptDefinitionProvider import org.jetbrains.kotlin.script.findScriptDefinition import kotlin.script.experimental.dependencies.ScriptDependencies class ScriptDependenciesUpdater( private val project: Project, - private val cache: ScriptDependenciesCache, - private val scriptDefinitionProvider: ScriptDefinitionProvider + private val cache: ScriptDependenciesCache ) { private val scriptsQueue = Alarm(Alarm.ThreadToUse.SWING_THREAD, project) private val scriptChangesListenerDelay = 1400 @@ -55,7 +53,7 @@ class ScriptDependenciesUpdater( fun getCurrentDependencies(file: VirtualFile): ScriptDependencies { cache[file]?.let { return it } - val scriptDef = scriptDefinitionProvider.findScriptDefinition(file) ?: return ScriptDependencies.Empty + val scriptDef = findScriptDefinition(file, project) ?: return ScriptDependencies.Empty FromFileAttributeScriptDependenciesLoader(file, scriptDef, project).updateDependencies() ScriptDependenciesLoader.updateDependencies(file, scriptDef, project, shouldNotifyRootsChanged = false) @@ -75,9 +73,10 @@ class ScriptDependenciesUpdater( private fun runScriptDependenciesUpdateIfNeeded(file: VirtualFile) { if (file.fileType != KotlinFileType.INSTANCE) return - val scriptDef = scriptDefinitionProvider.findScriptDefinition(file) ?: return val ktFile = PsiManager.getInstance(project).findFile(file) as? KtFile ?: return + val scriptDef = findScriptDefinition(ktFile) ?: return + if (!ScriptDefinitionsManager.getInstance(project).isInExpectedLocation(ktFile, scriptDef)) return ScriptDependenciesLoader.updateDependencies(file, scriptDef, project, shouldNotifyRootsChanged = true) } @@ -101,8 +100,8 @@ class ScriptDependenciesUpdater( return } - val scriptDef = scriptDefinitionProvider.findScriptDefinition(file) ?: return val ktFile = PsiManager.getInstance(project).findFile(file) as? KtFile ?: return + val scriptDef = findScriptDefinition(ktFile) ?: return if (!ScriptDefinitionsManager.getInstance(project).isInExpectedLocation(ktFile, scriptDef)) return diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/KotlinScriptResolveScopeProvider.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/KotlinScriptResolveScopeProvider.kt index 8916c3b04e8..5175461cc79 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/KotlinScriptResolveScopeProvider.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/KotlinScriptResolveScopeProvider.kt @@ -23,7 +23,7 @@ import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager import org.jetbrains.kotlin.idea.core.script.StandardIdeScriptDefinition import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromAnnotatedTemplate -import org.jetbrains.kotlin.script.getScriptDefinition +import org.jetbrains.kotlin.script.findScriptDefinition class KotlinScriptResolveScopeProvider : ResolveScopeProvider() { companion object { @@ -32,7 +32,7 @@ class KotlinScriptResolveScopeProvider : ResolveScopeProvider() { } override fun getResolveScope(file: VirtualFile, project: Project): GlobalSearchScope? { - val scriptDefinition = getScriptDefinition(file, project) + val scriptDefinition = findScriptDefinition(file, project) // TODO: this should get this particular scripts dependencies return when { scriptDefinition == null -> null