From adb4d264ecbbe4ba191529c6b3857fd0460378b4 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Thu, 14 Feb 2019 10:10:36 +0100 Subject: [PATCH] Move script definition extraction functions to the plugin plus finish refactoring of these functions --- .../script/KotlinScriptDefinitionProvider.kt | 44 --------------- .../idea/caches/project/getModuleInfo.kt | 2 +- .../idea/project/TargetPlatformDetector.java | 6 +- .../kotlin/idea/search/searchUtil.kt | 4 +- .../kotlin/idea/util/ProjectRootsUtil.kt | 6 +- .../core/script/ScriptDependenciesManager.kt | 4 +- .../core/script/ScriptDependenciesUpdater.kt | 6 +- .../AsyncScriptDependenciesLoader.kt | 4 +- .../KotlinScriptResolveScopeProvider.kt | 4 +- .../plugin/definitions/definitions.kt | 55 +++++++++++++++++++ .../plugin/resolve/LazyScriptDescriptor.kt | 5 +- .../legacy/CliScriptDependenciesProvider.kt | 8 ++- 12 files changed, 82 insertions(+), 66 deletions(-) create mode 100644 plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/definitions/definitions.kt diff --git a/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt b/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt index 8dec105c256..71218627b1f 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt @@ -16,15 +16,8 @@ package org.jetbrains.kotlin.script -import com.intellij.ide.highlighter.JavaClassFileType import com.intellij.openapi.components.ServiceManager -import com.intellij.openapi.fileTypes.FileTypeRegistry 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 interface ScriptDefinitionProvider { fun findScriptDefinition(fileName: String): KotlinScriptDefinition? @@ -39,41 +32,4 @@ interface ScriptDefinitionProvider { } } -fun PsiFile.scriptDefinition(): KotlinScriptDefinition? { - // Do not use psiFile.script, see comments in findScriptDefinition - if (this !is KtFile/* || this.script == null*/) return null - val file = virtualFile ?: originalFile.virtualFile ?: return null - if (file.isNonScript()) return null - - return scriptDefinitionByFileName(project, file.name) -} - -fun findScriptDefinition(file: VirtualFile, project: Project): KotlinScriptDefinition? { - if (file.isNonScript()) return null - // Do not use psiFile.script here because this method can be called during indexes access - // and accessing stubs may cause deadlock - // TODO: measure performace effect and if necessary consider detecting indexing here or using separate logic for non-IDE operations to speed up filtering - if ((PsiManager.getInstance(project).findFile(file) as? KtFile)/*?.script*/ == null) return null - - return scriptDefinitionByFileName(project, file.name) -} - -fun scriptDefinitionByFileName(project: Project, fileName: String): KotlinScriptDefinition { - val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) ?: return null - ?: throw IllegalStateException("Unable to get script definition: ScriptDefinitionProvider is not configured.") - - return scriptDefinitionProvider.findScriptDefinition(fileName) ?: scriptDefinitionProvider.getDefaultScriptDefinition() -} - -private fun VirtualFile.isNonScript(): Boolean = - isDirectory || - extension == KotlinFileType.EXTENSION || - extension == JavaClassFileType.INSTANCE.defaultExtension || - !this.isKotlinFileType() - -private fun VirtualFile.isKotlinFileType(): Boolean { - val typeRegistry = FileTypeRegistry.getInstance() - return typeRegistry.getFileTypeByFile(this) == KotlinFileType.INSTANCE || - typeRegistry.getFileTypeByFileName(name) == KotlinFileType.INSTANCE -} 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 89aea25343c..78703aeb8cb 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 @@ -27,7 +27,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.scriptDefinitionByFileName +import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.scriptDefinitionByFileName import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.sure import org.jetbrains.kotlin.utils.yieldIfNotNull diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/TargetPlatformDetector.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/TargetPlatformDetector.java index d02e1940951..cc506d610f9 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/TargetPlatformDetector.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/TargetPlatformDetector.java @@ -32,9 +32,7 @@ import org.jetbrains.kotlin.psi.KtPsiFactoryKt; import org.jetbrains.kotlin.resolve.TargetPlatform; import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform; import org.jetbrains.kotlin.script.KotlinScriptDefinition; -import org.jetbrains.kotlin.script.KotlinScriptDefinitionProviderKt; - -import static org.jetbrains.kotlin.script.KotlinScriptDefinitionProviderKt.findScriptDefinition; +import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.DefinitionsKt; public class TargetPlatformDetector { public static final TargetPlatformDetector INSTANCE = new TargetPlatformDetector(); @@ -62,7 +60,7 @@ public class TargetPlatformDetector { } if (file.isScript()) { - KotlinScriptDefinition scriptDefinition = KotlinScriptDefinitionProviderKt.scriptDefinition(file); + KotlinScriptDefinition scriptDefinition = DefinitionsKt.scriptDefinition(file); if (scriptDefinition != null) { String platformNameFromScriptDefinition = scriptDefinition.getPlatform(); for (IdePlatform platform : IdePlatformKind.Companion.getAll_PLATFORMS()) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/searchUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/searchUtil.kt index ba6e4859f25..8fdc8d78622 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/searchUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/searchUtil.kt @@ -39,7 +39,7 @@ import org.jetbrains.kotlin.idea.util.compat.psiSearchHelperInstance import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.script.findScriptDefinition +import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.findScriptDefinition import org.jetbrains.kotlin.types.expressions.OperatorConventions infix fun SearchScope.and(otherScope: SearchScope): SearchScope = intersectWith(otherScope) @@ -135,7 +135,7 @@ private fun isCheapToSearchUsagesInScripts(scope: GlobalSearchScope, name: Strin val processor = object : Processor { override fun process(file: VirtualFile): Boolean { ProgressManager.checkCanceled() - if (findScriptDefinition(file, project) == null) return true + if (file.findScriptDefinition(project) == null) return true return scriptsCount++ < 3 } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ProjectRootsUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ProjectRootsUtil.kt index 6638303e078..b033eb95dec 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ProjectRootsUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ProjectRootsUtil.kt @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager import org.jetbrains.kotlin.idea.decompiler.builtIns.KotlinBuiltInFileType import org.jetbrains.kotlin.idea.decompiler.js.KotlinJavaScriptMetaFileType import org.jetbrains.kotlin.idea.util.application.runReadAction -import org.jetbrains.kotlin.script.findScriptDefinition +import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.findScriptDefinition import kotlin.script.experimental.location.ScriptExpectedLocation abstract class KotlinBinaryExtension(val fileType: FileType) { @@ -69,7 +69,7 @@ object ProjectRootsUtil { includeScriptDependencies: Boolean, includeScriptsOutsideSourceRoots: Boolean, fileIndex: ProjectFileIndex = ProjectFileIndex.SERVICE.getInstance(project) ): Boolean { - val scriptDefinition = findScriptDefinition(file, project) + val scriptDefinition = file.findScriptDefinition(project) if (scriptDefinition != null) { val scriptScope = scriptDefinition.scriptExpectedLocations val includeAll = scriptScope.contains(ScriptExpectedLocation.Everywhere) @@ -115,7 +115,7 @@ object ProjectRootsUtil { if (ProjectRootManager.getInstance(project).fileIndex.isInContent(file) || ScratchUtil.isScratch(file)) { return true } - return findScriptDefinition(file, project)?.scriptExpectedLocations?.contains(ScriptExpectedLocation.Everywhere) == true + return file.findScriptDefinition(project)?.scriptExpectedLocations?.contains(ScriptExpectedLocation.Everywhere) == true } if (!includeLibraryClasses && !includeLibrarySource) return false 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 1e9f5b309ab..a5370fb0677 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 @@ -25,7 +25,7 @@ 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.ScriptDependenciesProvider -import org.jetbrains.kotlin.script.findScriptDefinition +import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.findScriptDefinition import java.io.File import kotlin.script.experimental.dependencies.ScriptDependencies @@ -76,7 +76,7 @@ class ScriptDependenciesManager internal constructor( @TestOnly fun updateScriptDependenciesSynchronously(virtualFile: VirtualFile, project: Project) { - val scriptDefinition = findScriptDefinition(virtualFile, project)!! + val scriptDefinition = virtualFile.findScriptDefinition(project)!! SyncScriptDependenciesLoader(project).updateDependencies(virtualFile, scriptDefinition) } } 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 7e36f1b8173..1969a2a469a 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 @@ -40,8 +40,8 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.NotNullableUserDataProperty import org.jetbrains.kotlin.script.KotlinScriptDefinition import org.jetbrains.kotlin.script.LegacyResolverWrapper -import org.jetbrains.kotlin.script.findScriptDefinition -import org.jetbrains.kotlin.script.scriptDefinition +import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.findScriptDefinition +import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.scriptDefinition import kotlin.script.experimental.dependencies.AsyncDependenciesResolver import kotlin.script.experimental.dependencies.ScriptDependencies @@ -63,7 +63,7 @@ class ScriptDependenciesUpdater( fun getCurrentDependencies(file: VirtualFile): ScriptDependencies { cache[file]?.let { return it } - val scriptDef = findScriptDefinition(file, project) ?: return ScriptDependencies.Empty + val scriptDef = file.findScriptDefinition(project) ?: return ScriptDependencies.Empty fileAttributeLoader.updateDependencies(file, scriptDef) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt index 8f83c860add..ef61188c784 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings import org.jetbrains.kotlin.script.KotlinScriptDefinition import org.jetbrains.kotlin.script.LegacyResolverWrapper import org.jetbrains.kotlin.script.asResolveFailure -import org.jetbrains.kotlin.script.findScriptDefinition +import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.findScriptDefinition import java.util.concurrent.ConcurrentLinkedQueue import java.util.concurrent.locks.ReentrantReadWriteLock import kotlin.concurrent.write @@ -43,7 +43,7 @@ class AsyncScriptDependenciesLoader internal constructor(project: Project) : Scr override fun shouldShowNotification(): Boolean = !KotlinScriptingSettings.getInstance(project).isAutoReloadEnabled private fun runDependenciesUpdate(file: VirtualFile) { - val scriptDef = runReadAction { findScriptDefinition(file, project) } ?: return + val scriptDef = runReadAction { file.findScriptDefinition(project) } ?: return // runBlocking is using there to avoid loading dependencies asynchronously // because it leads to starting more than one gradle daemon in case of resolving dependencies in build.gradle.kts // It is more efficient to use one hot daemon consistently than multiple daemon in parallel 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 5175461cc79..88fed5d44f2 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.findScriptDefinition +import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.findScriptDefinition class KotlinScriptResolveScopeProvider : ResolveScopeProvider() { companion object { @@ -32,7 +32,7 @@ class KotlinScriptResolveScopeProvider : ResolveScopeProvider() { } override fun getResolveScope(file: VirtualFile, project: Project): GlobalSearchScope? { - val scriptDefinition = findScriptDefinition(file, project) + val scriptDefinition = file.findScriptDefinition(project) // TODO: this should get this particular scripts dependencies return when { scriptDefinition == null -> null diff --git a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/definitions/definitions.kt b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/definitions/definitions.kt new file mode 100644 index 00000000000..5e071bb1c94 --- /dev/null +++ b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/definitions/definitions.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.scripting.compiler.plugin.definitions + +import com.intellij.ide.highlighter.JavaClassFileType +import com.intellij.openapi.fileTypes.FileTypeRegistry +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 org.jetbrains.kotlin.script.KotlinScriptDefinition +import org.jetbrains.kotlin.script.ScriptDefinitionProvider + +fun PsiFile.scriptDefinition(): KotlinScriptDefinition? { + // Do not use psiFile.script, see comments in findScriptDefinition + if (this !is KtFile/* || this.script == null*/) return null + val file = virtualFile ?: originalFile.virtualFile ?: return null + if (file.isNonScript()) return null + + return scriptDefinitionByFileName(project, file.name) +} + +fun VirtualFile.findScriptDefinition(project: Project): KotlinScriptDefinition? { + if (isNonScript()) return null + // Do not use psiFile.script here because this method can be called during indexes access + // and accessing stubs may cause deadlock + // TODO: measure performance effect and if necessary consider detecting indexing here or using separate logic for non-IDE operations to speed up filtering + if ((PsiManager.getInstance(project).findFile(this) as? KtFile)/*?.script*/ == null) return null + + return scriptDefinitionByFileName(project, name) +} + +fun scriptDefinitionByFileName(project: Project, fileName: String): KotlinScriptDefinition { + val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) ?: return null + ?: throw IllegalStateException("Unable to get script definition: ScriptDefinitionProvider is not configured.") + + return scriptDefinitionProvider.findScriptDefinition(fileName) ?: scriptDefinitionProvider.getDefaultScriptDefinition() +} + +private fun VirtualFile.isNonScript(): Boolean = + isDirectory || + extension == KotlinFileType.EXTENSION || + extension == JavaClassFileType.INSTANCE.defaultExtension || + !this.isKotlinFileType() + +private fun VirtualFile.isKotlinFileType(): Boolean { + val typeRegistry = FileTypeRegistry.getInstance() + return typeRegistry.getFileTypeByFile(this) == KotlinFileType.INSTANCE || + typeRegistry.getFileTypeByFileName(name) == KotlinFileType.INSTANCE +} diff --git a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/resolve/LazyScriptDescriptor.kt b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/resolve/LazyScriptDescriptor.kt index 36f3f1e218c..0fdca98529a 100644 --- a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/resolve/LazyScriptDescriptor.kt +++ b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/resolve/LazyScriptDescriptor.kt @@ -33,7 +33,10 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.LexicalScopeImpl import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind import org.jetbrains.kotlin.resolve.source.toSourceElement -import org.jetbrains.kotlin.script.* +import org.jetbrains.kotlin.script.KotlinScriptDefinition +import org.jetbrains.kotlin.script.ScriptDependenciesProvider +import org.jetbrains.kotlin.script.ScriptPriorities +import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.scriptDefinitionByFileName import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.typeUtil.isNothing import org.jetbrains.kotlin.types.typeUtil.isUnit diff --git a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/legacy/CliScriptDependenciesProvider.kt b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/legacy/CliScriptDependenciesProvider.kt index 723811d8e51..7d0d8721d17 100644 --- a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/legacy/CliScriptDependenciesProvider.kt +++ b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/legacy/CliScriptDependenciesProvider.kt @@ -20,7 +20,11 @@ import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile -import org.jetbrains.kotlin.script.* +import org.jetbrains.kotlin.script.ScriptContentLoader +import org.jetbrains.kotlin.script.ScriptDependenciesProvider +import org.jetbrains.kotlin.script.ScriptReportSink +import org.jetbrains.kotlin.script.adjustByDefinition +import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.findScriptDefinition import java.io.File import java.util.concurrent.locks.ReentrantReadWriteLock import kotlin.concurrent.read @@ -41,7 +45,7 @@ class CliScriptDependenciesProvider(private val project: Project) : ScriptDepend val cached = cache[path] return if (cached != null) cached else { - val scriptDef = findScriptDefinition(file, project) + val scriptDef = file.findScriptDefinition(project) if (scriptDef != null) { val result = scriptContentLoader.loadContentsAndResolveDependencies(scriptDef, file)