[kotlin] Do not index kotlin files outside of source roots

#KTIJ-21664

GitOrigin-RevId: 425f2385c6ce332c40dbbc1e171f8997acdf4594
This commit is contained in:
Vladimir Dolzhenko
2022-05-07 18:05:53 +00:00
committed by intellij-monorepo-bot
parent d05e4706f3
commit 360a5e7f69
7 changed files with 79 additions and 17 deletions
@@ -0,0 +1,31 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.stubindex
import com.intellij.find.ngrams.TrigramIndex
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ProjectFileIndex
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.util.registry.Registry
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.search.FilenameIndex
import com.intellij.util.indexing.GlobalIndexFilter
import com.intellij.util.indexing.IndexId
import org.jetbrains.kotlin.idea.KotlinFileType
class KotlinNonSourceRootIndexFilter: GlobalIndexFilter {
private val enabled = !Registry.`is`("kotlin.index.non.source.roots")
override fun isExcludedFromIndex(virtualFile: VirtualFile, indexId: IndexId<*, *>): Boolean = false
override fun isExcludedFromIndex(virtualFile: VirtualFile, indexId: IndexId<*, *>, project: Project?): Boolean =
project != null &&
affectsIndex(indexId) &&
virtualFile.extension == KotlinFileType.EXTENSION &&
ProjectRootManager.getInstance(project).fileIndex.getOrderEntriesForFile(virtualFile).isEmpty() &&
!ProjectFileIndex.getInstance(project).isInLibrary(virtualFile)
override fun getVersion(): Int = 0
override fun affectsIndex(indexId: IndexId<*, *>): Boolean =
enabled && (indexId !== TrigramIndex.INDEX_ID && indexId !== FilenameIndex.NAME)
}
@@ -10,6 +10,7 @@ import com.intellij.testFramework.runInEdtAndWait
import com.intellij.util.io.readText
import org.jetbrains.kotlin.idea.core.util.toPsiFile
import org.jetbrains.kotlin.idea.test.DirectiveBasedActionUtils
import org.jetbrains.kotlin.idea.test.waitIndexingComplete
import org.jetbrains.kotlin.psi.KtFile
import java.io.File
import java.nio.file.Files
@@ -75,6 +76,8 @@ abstract class AbstractGradleMultiFileQuickFixTest : MultiplePluginVersionGradle
)
}
myProject.waitIndexingComplete("indexing new created modules")
codeInsightTestFixture.doHighlighting()
DirectiveBasedActionUtils.checkAvailableActionsAreExpected(ktFile, action?.let { actions - it } ?: actions)
DirectiveBasedActionUtils.checkForUnexpectedErrors(ktFile)
@@ -26,14 +26,11 @@ import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionsManager
import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings
import org.jetbrains.kotlin.idea.highlighter.KotlinHighlightingUtil
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationTest.Companion.useDefaultTemplate
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.idea.test.runAll
import org.jetbrains.kotlin.idea.test.*
import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.idea.util.projectStructure.getModuleDir
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
import org.jetbrains.kotlin.idea.test.KotlinCompilerStandalone
import org.jetbrains.kotlin.idea.test.KotlinTestUtils
import org.jetbrains.kotlin.test.TestJdkKind
import org.jetbrains.kotlin.test.util.addDependency
import org.jetbrains.kotlin.test.util.projectLibrary
@@ -123,23 +120,24 @@ abstract class AbstractScriptConfigurationTest : KotlinCompletionTestCase() {
module.addDependency(
projectLibrary(
"script-template-library",
classesRoot = VfsUtil.findFileByIoFile(environment["template-classes"] as File, true)
classesRoot = environment.toVirtualFile("template-classes")
)
)
}
}
if (configureConflictingModule in environment) {
val sharedLib = VfsUtil.findFileByIoFile(environment["lib-classes"] as File, true)!!
val sharedLib = environment.toVirtualFile("lib-classes")
val sharedLibSources = environment.toVirtualFile("lib-source")
if (module == null) {
// Force create module if it doesn't exist
myModule = createTestModuleByName("mainModule")
}
module.addDependency(projectLibrary("sharedLib", classesRoot = sharedLib))
module.addDependency(projectLibrary("sharedLib", classesRoot = sharedLib, sourcesRoot = sharedLibSources))
}
if (module != null) {
ModuleRootModificationUtil.updateModel(module) { model ->
module?.let {
ModuleRootModificationUtil.updateModel(it) { model ->
model.sdk = sdk
}
}
@@ -147,6 +145,11 @@ abstract class AbstractScriptConfigurationTest : KotlinCompletionTestCase() {
return createFileAndSyncDependencies(mainScriptFile)
}
private fun Environment.toVirtualFile(name: String): VirtualFile {
val value = this[name] as? File ?: error("no file value for '$name'")
return VfsUtil.findFileByIoFile(value, true) ?: error("unable to look up a virtual file for $name: $value")
}
private val oldScripClasspath: String? = System.getProperty("kotlin.script.classpath")
private var settings: Element? = null
@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.idea.macros.KOTLIN_BUNDLED
import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.idea.test.resetCodeStyle
import org.jetbrains.kotlin.idea.test.runAll
import org.jetbrains.kotlin.idea.test.waitIndexingComplete
import org.jetbrains.kotlin.platform.CommonPlatforms
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.isCommon
@@ -2630,7 +2631,7 @@ abstract class AbstractKotlinMavenImporterTest : KotlinMavenImportingTestCase()
)
importProjects(pomMain, pomA, pomB)
myProject.waitIndexingComplete()
assertModules("module-with-kotlin", "module-with-java", "mvnktest")
val dependencies = (dummyFile.toPsiFile(myProject) as KtFile).analyzeAndGetResult().moduleDescriptor.allDependencyModules
@@ -10,7 +10,6 @@ import com.intellij.openapi.actionSystem.IdeActions
import com.intellij.openapi.editor.EditorFactory
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.profile.codeInspection.ProjectInspectionProfileManager
@@ -21,7 +20,6 @@ import com.intellij.testFramework.*
import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl
import com.intellij.util.ArrayUtilRt
import com.intellij.util.ThrowableRunnable
import com.intellij.util.indexing.UnindexedFilesUpdater
import com.intellij.util.ui.UIUtil
import org.jetbrains.kotlin.idea.testFramework.Stats
import org.jetbrains.kotlin.idea.testFramework.Stats.Companion.WARM_UP
@@ -33,6 +31,7 @@ import org.jetbrains.kotlin.idea.performance.tests.utils.logMessage
import org.jetbrains.kotlin.idea.performance.tests.utils.project.*
import org.jetbrains.kotlin.idea.search.usagesSearch.ExpressionsOfTypeProcessor
import org.jetbrains.kotlin.idea.test.invalidateLibraryCache
import org.jetbrains.kotlin.idea.test.waitIndexingComplete
import org.jetbrains.kotlin.idea.testFramework.*
import org.jetbrains.kotlin.idea.testFramework.Fixture.Companion.openFixture
import org.jetbrains.kotlin.test.KotlinRoot
@@ -217,11 +216,7 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() {
logMessage { "project $name is ${if (project.isInitialized) "initialized" else "not initialized"}" }
with(DumbService.getInstance(project)) {
queueTask(UnindexedFilesUpdater(project))
completeJustSubmittedTasks()
}
dispatchAllInvocationEvents()
project.waitIndexingComplete("index project")
Fixture.enableAnnotatorsAndLoadDefinitions(project)
@@ -59,5 +59,13 @@
serviceInterface="org.jetbrains.kotlin.psi.stubs.elements.StubIndexService"
serviceImplementation="org.jetbrains.kotlin.idea.stubindex.IdeStubIndexService"/>
<globalIndexFilter implementation="org.jetbrains.kotlin.idea.stubindex.KotlinNonSourceRootIndexFilter"/>
<registryKey
key="kotlin.index.non.source.roots"
description="Index Kotlin files outside of source roots"
defaultValue="true"
restartRequired="true"/>
</extensions>
</idea-plugin>
@@ -3,18 +3,25 @@
package org.jetbrains.kotlin.idea.test
import com.intellij.lang.annotation.HighlightSeverity
import com.intellij.openapi.application.invokeAndWaitIfNeeded
import com.intellij.openapi.diagnostic.ControlFlowException
import com.intellij.openapi.editor.Document
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiDocumentManager
import com.intellij.testFramework.LightPlatformTestCase
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
import com.intellij.util.indexing.IndexingFlag
import com.intellij.util.indexing.UnindexedFilesUpdater
import com.intellij.util.ui.UIUtil
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory
import org.jetbrains.kotlin.diagnostics.Severity
import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages
import org.jetbrains.kotlin.idea.caches.project.LibraryModificationTracker
import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithContent
import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.idea.util.rootManager
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.KotlinRoot
import java.io.File
@@ -57,6 +64,20 @@ fun JavaCodeInsightTestFixture.dumpErrorLines(): List<String> {
}
}
fun Project.waitIndexingComplete(indexingReason: String? = null) {
val project = this
UIUtil.dispatchAllInvocationEvents()
invokeAndWaitIfNeeded {
// TODO: [VD] a dirty hack to reindex created android project
IndexingFlag.cleanupProcessedFlag()
with(DumbService.getInstance(project)) {
queueTask(UnindexedFilesUpdater(project, indexingReason))
completeJustSubmittedTasks()
}
UIUtil.dispatchAllInvocationEvents()
}
}
fun closeAndDeleteProject() = LightPlatformTestCase.closeAndDeleteProject()
fun invalidateLibraryCache(project: Project) {