From 37976e516ce03629016ff2113e927673801a6f6d Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 1 Feb 2016 20:36:01 +0100 Subject: [PATCH] postpone isJsProject() check #KT-9026 Fixed --- .../stubindex/KotlinSourceFilterScope.java | 10 +++---- .../kotlin/idea/util/ProjectRootsUtil.kt | 28 +++++++++++++------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/KotlinSourceFilterScope.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/KotlinSourceFilterScope.java index 408d5758e86..da608e8068c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/KotlinSourceFilterScope.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/KotlinSourceFilterScope.java @@ -19,11 +19,11 @@ package org.jetbrains.kotlin.idea.stubindex; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.search.DelegatingGlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.idea.caches.resolve.JsProjectDetector; import org.jetbrains.kotlin.idea.util.ProjectRootsUtil; public class KotlinSourceFilterScope extends DelegatingGlobalSearchScope { @@ -84,7 +84,9 @@ public class KotlinSourceFilterScope extends DelegatingGlobalSearchScope { private final boolean includeProjectSourceFiles; private final boolean includeLibrarySourceFiles; private final boolean includeClassFiles; - private final boolean isJsProject; + + //NOTE: avoid recomputing in potentially bottleneck 'contains' method + private final Ref isJsProjectRef = new Ref(); private KotlinSourceFilterScope( @NotNull GlobalSearchScope delegate, @@ -98,9 +100,7 @@ public class KotlinSourceFilterScope extends DelegatingGlobalSearchScope { this.includeProjectSourceFiles = includeProjectSourceFiles; this.includeLibrarySourceFiles = includeLibrarySourceFiles; this.includeClassFiles = includeClassFiles; - //NOTE: avoid recomputing in potentially bottleneck 'contains' method this.index = ProjectRootManager.getInstance(project).getFileIndex(); - this.isJsProject = JsProjectDetector.isJsProject(project); } @Override @@ -112,7 +112,7 @@ public class KotlinSourceFilterScope extends DelegatingGlobalSearchScope { public boolean contains(@NotNull VirtualFile file) { if (!super.contains(file)) return false; return ProjectRootsUtil.isInContent( - project, file, includeProjectSourceFiles, includeLibrarySourceFiles, includeClassFiles, index, isJsProject + project, file, includeProjectSourceFiles, includeLibrarySourceFiles, includeClassFiles, index, isJsProjectRef ); } } 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 c61ce882ebc..6669df6789d 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 @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.util import com.intellij.ide.highlighter.JavaClassFileType import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ProjectFileIndex +import com.intellij.openapi.util.Ref import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiElement @@ -33,21 +34,30 @@ object ProjectRootsUtil { @JvmStatic fun isInContent(project: Project, file: VirtualFile, includeProjectSource: Boolean, includeLibrarySource: Boolean, includeLibraryClasses: Boolean, fileIndex: ProjectFileIndex = ProjectFileIndex.SERVICE.getInstance(project), - isJsProject: Boolean? = null): Boolean { + isJsProjectRef: Ref? = null): Boolean { if (includeProjectSource && fileIndex.isInSourceContent(file)) { return true } - if (!includeLibraryClasses && !includeLibrarySource) return false - //NOTE: avoid computing isJsProject if redundant - if (isJsProject ?: JsProjectDetector.isJsProject(project)) { - return (includeLibrarySource && fileIndex.isInLibrarySource(file)) - || (includeLibraryClasses && fileIndex.isLibraryClassFile(file)) - } // NOTE: the following is a workaround for cases when class files are under library source roots and source files are under class roots val isClassFile = file.fileType in classFileLike - return (includeLibraryClasses && isClassFile && fileIndex.isInLibraryClasses(file)) - || (includeLibrarySource && !isClassFile && fileIndex.isInLibrarySource(file)) + + if ((includeLibraryClasses && isClassFile && fileIndex.isInLibraryClasses(file)) || + (includeLibrarySource && !isClassFile && fileIndex.isInLibrarySource(file))) { + + return true + } + + if ((includeLibraryClasses && fileIndex.isInLibraryClasses(file)) || + (includeLibrarySource && fileIndex.isInLibrarySource(file))) { + + //NOTE: avoid computing isJsProject if redundant + val isJsProject = isJsProjectRef?.get() ?: JsProjectDetector.isJsProject(project) + isJsProjectRef?.set(isJsProject) + return isJsProject + } + + return false } @JvmStatic fun isInContent(