From d1a1594f2698a91dd6ac2eb59a0610c60f9122c0 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Wed, 13 Feb 2019 17:57:28 +0100 Subject: [PATCH] Remove redundant direct usages of the ScriptDefinition in compiler plus some refactoring around definition extraction --- .../kotlin/resolve/lazy/ResolveSession.java | 9 ++++ .../org/jetbrains/kotlin/psi/KtScript.java | 16 ++----- .../script/KotlinScriptDefinitionProvider.kt | 48 +++++++++---------- .../idea/caches/project/getModuleInfo.kt | 6 ++- .../idea/project/TargetPlatformDetector.java | 3 +- .../core/script/ScriptDependenciesUpdater.kt | 5 +- .../plugin/resolve/LazyScriptDescriptor.kt | 8 ++-- 7 files changed, 48 insertions(+), 47 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java index a1652dbfa11..613a11b9815 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java @@ -84,6 +84,8 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext { private final SyntheticResolveExtension syntheticResolveExtension; + private Project project; + @Inject public void setAnnotationResolve(AnnotationResolver annotationResolver) { this.annotationResolver = annotationResolver; @@ -190,6 +192,8 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext { danglingAnnotations = storageManager.createMemoizedFunction(file -> createAnnotations(file, file.getDanglingAnnotations())); syntheticResolveExtension = SyntheticResolveExtension.Companion.getInstance(project); + + this.project = project; } private LazyAnnotations createAnnotations(KtFile file, List annotationEntries) { @@ -451,6 +455,11 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext { return platformDiagnosticSuppressor; } + @NotNull + public Project getProject() { + return project; + } + @Override public void assertValid() { module.assertValid(); diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtScript.java b/compiler/psi/src/org/jetbrains/kotlin/psi/KtScript.java index 9c2e7e403e9..76e8905955d 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtScript.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtScript.java @@ -20,23 +20,14 @@ import com.intellij.lang.ASTNode; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.name.FqName; +import org.jetbrains.kotlin.name.Name; +import org.jetbrains.kotlin.name.NameUtils; import org.jetbrains.kotlin.psi.stubs.KotlinScriptStub; import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes; -import org.jetbrains.kotlin.script.KotlinScriptDefinition; -import org.jetbrains.kotlin.script.ScriptDefinitionProvider; import java.util.List; public class KtScript extends KtNamedDeclarationStub implements KtDeclarationContainer { - public KotlinScriptDefinition getKotlinScriptDefinition() { - ScriptDefinitionProvider definitionsProvider = ScriptDefinitionProvider.Companion.getInstance(getProject()); - if (definitionsProvider == null) { - throw new IllegalStateException("Unable to use KtScript: ScriptDefinitionProvider is not configured."); - } - KotlinScriptDefinition definition = definitionsProvider.findScriptDefinition(getContainingKtFile().getName()); - return definition != null ? definition : definitionsProvider.getDefaultScriptDefinition(); - } - public KtScript(@NotNull ASTNode node) { super(node); } @@ -53,7 +44,8 @@ public class KtScript extends KtNamedDeclarationStub implement return stub.getFqName(); } KtFile containingKtFile = getContainingKtFile(); - return containingKtFile.getPackageFqName().child(getKotlinScriptDefinition().getScriptName(this)); + Name fileBasedName = NameUtils.getScriptNameForFile(containingKtFile.getName()); + return containingKtFile.getPackageFqName().child(fileBasedName); } @Override diff --git a/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt b/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt index 3c1cba17799..ac884d054bd 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt @@ -39,39 +39,37 @@ interface ScriptDefinitionProvider { } } -fun findScriptDefinition(psiFile: PsiFile): KotlinScriptDefinition? { - val virtualFile = psiFile.virtualFile ?: psiFile.originalFile.virtualFile ?: return null - return findScriptDefinition(virtualFile, psiFile.project) +fun PsiFile.scriptDefinition(): KotlinScriptDefinition? { + 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.isDirectory || - file.extension == KotlinFileType.EXTENSION || - file.extension == JavaClassFileType.INSTANCE.defaultExtension || - !isKotlinFileType(file) - ) { - return null - } + if (file.isNonScript()) return null + 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 - val psiFile = PsiManager.getInstance(project).findFile(file) - if (psiFile != null) { - if (psiFile !is KtFile) return null + ?: throw IllegalStateException("Unable to get script definition: ScriptDefinitionProvider is not configured.") - // Do not use psiFile.script here because this method can be called during indexes access - // and accessing stubs may cause deadlock - // If script definition cannot be find, default script definition is used - // because all KtFile-s with KotlinFileType and non-kts extensions are parsed as scripts - val definition = scriptDefinitionProvider.findScriptDefinition(file.name) - return definition ?: scriptDefinitionProvider.getDefaultScriptDefinition() - } - - return scriptDefinitionProvider.findScriptDefinition(file.name) + return scriptDefinitionProvider.findScriptDefinition(fileName) ?: scriptDefinitionProvider.getDefaultScriptDefinition() } -private fun isKotlinFileType(file: VirtualFile): Boolean { +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(file) == KotlinFileType.INSTANCE || - typeRegistry.getFileTypeByFileName(file.name) == KotlinFileType.INSTANCE + 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 904106fc1f4..89aea25343c 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,6 +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.utils.addIfNotNull import org.jetbrains.kotlin.utils.sure import org.jetbrains.kotlin.utils.yieldIfNotNull @@ -172,8 +173,9 @@ private fun PsiElement.collectInfos(c: ModuleInfoCollector): T { getModuleRelatedModuleInfo(project, virtualFile)?.let { return c.onResult(it) } - containingKtFile.script?.kotlinScriptDefinition?.let { - return c.onResult(ScriptModuleInfo(project, virtualFile, it)) + containingKtFile.script?.let { + val definition = scriptDefinitionByFileName(project, containingKtFile.name) + return c.onResult(ScriptModuleInfo(project, virtualFile, definition)) } } 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 3297729e41c..d02e1940951 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,6 +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; @@ -61,7 +62,7 @@ public class TargetPlatformDetector { } if (file.isScript()) { - KotlinScriptDefinition scriptDefinition = findScriptDefinition(file); + KotlinScriptDefinition scriptDefinition = KotlinScriptDefinitionProviderKt.scriptDefinition(file); if (scriptDefinition != null) { String platformNameFromScriptDefinition = scriptDefinition.getPlatform(); for (IdePlatform platform : IdePlatformKind.Companion.getAll_PLATFORMS()) { 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 34d58ecc4c9..7e36f1b8173 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 @@ -41,6 +41,7 @@ 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 kotlin.script.experimental.dependencies.AsyncDependenciesResolver import kotlin.script.experimental.dependencies.ScriptDependencies @@ -95,7 +96,7 @@ class ScriptDependenciesUpdater( if (ApplicationManager.getApplication().isUnitTestMode && ApplicationManager.getApplication().isScriptDependenciesUpdaterDisabled == true) return - val scriptDef = ktFile.script?.kotlinScriptDefinition ?: return + val scriptDef = ktFile.scriptDefinition() ?: return if (!ProjectRootsUtil.isInProjectSource(ktFile, includeScriptsOutsideSourceRoots = true)) return @@ -122,7 +123,7 @@ class ScriptDependenciesUpdater( } val ktFile = PsiManager.getInstance(project).findFile(file) as? KtFile ?: return - val scriptDef = ktFile.script?.kotlinScriptDefinition ?: return + val scriptDef = ktFile.scriptDefinition() ?: return if (!ProjectRootsUtil.isInProjectSource(ktFile, includeScriptsOutsideSourceRoots = true)) return 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 7a1a737202d..36f3f1e218c 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,9 +33,7 @@ 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.KotlinScriptDefinition -import org.jetbrains.kotlin.script.ScriptDependenciesProvider -import org.jetbrains.kotlin.script.ScriptPriorities +import org.jetbrains.kotlin.script.* import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.typeUtil.isNothing import org.jetbrains.kotlin.types.typeUtil.isUnit @@ -44,6 +42,7 @@ import java.io.File import kotlin.reflect.KClass import kotlin.reflect.KType + class LazyScriptDescriptor( val resolveSession: ResolveSession, containingDeclaration: DeclarationDescriptor, @@ -103,8 +102,7 @@ class LazyScriptDescriptor( override fun getPriority() = priority val scriptDefinition: () -> KotlinScriptDefinition = resolveSession.storageManager.createLazyValue { - val file = scriptInfo.script.containingKtFile - scriptInfo.script.kotlinScriptDefinition ?: throw RuntimeException("file ${file.name} is not a script") + scriptDefinitionByFileName(resolveSession.project, scriptInfo.script.containingKtFile.name) } override fun substitute(substitutor: TypeSubstitutor) = this