Load script definitions only from production source root and libraries

Exclude not connected to current project roots

EA-210662 Fixed
This commit is contained in:
Natalia Selezneva
2020-06-08 16:03:51 +03:00
parent 2d5b50531d
commit d1c88798df
@@ -10,10 +10,7 @@ import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.ReadAction
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ModuleRootEvent
import com.intellij.openapi.roots.ModuleRootListener
import com.intellij.openapi.roots.OrderEnumerator
import com.intellij.openapi.roots.ProjectFileIndex
import com.intellij.openapi.roots.*
import com.intellij.openapi.vfs.*
import com.intellij.util.concurrency.AppExecutorUtil
import com.intellij.util.indexing.FileBasedIndex
@@ -123,31 +120,40 @@ class ScriptTemplatesFromDependenciesProvider(private val project: Project) : Sc
.expireWith(project)
.submit(AppExecutorUtil.getAppExecutorService())
.onSuccess { roots ->
val jarFS = JarFileSystem.getInstance()
roots.forEach { root ->
if (logger.isDebugEnabled) {
logger.debug("root matching SCRIPT_DEFINITION_MARKERS_PATH found: ${root.path}")
}
val orderEntriesForFile = ProjectFileIndex.getInstance(project).getOrderEntriesForFile(root)
.filter {
if (it is ModuleSourceOrderEntry) {
!ModuleRootManager.getInstance(it.ownerModule).fileIndex.isInTestSourceContent(root)
} else {
it is LibraryOrSdkOrderEntry
}
}
.takeIf { it.isNotEmpty() } ?: return@forEach
root.findFileByRelativePath(SCRIPT_DEFINITION_MARKERS_PATH)?.children?.forEach { resourceFile ->
if (resourceFile.isValid && !resourceFile.isDirectory) {
templates.add(resourceFile.name.removeSuffix(SCRIPT_DEFINITION_MARKERS_EXTENSION_WITH_DOT))
}
}
val templateSource = jarFS.getVirtualFileForJar(root) ?: root
val module = ProjectFileIndex.getInstance(project).getModuleForFile(templateSource) ?: return@forEach
// assuming that all libraries are placed into classes roots
// TODO: extract exact library dependencies instead of putting all module dependencies into classpath
// minimizing the classpath needed to use the template by taking cp only from modules with new templates found
// on the other hand the approach may fail if some module contains a template without proper classpath, while
// the other has properly configured classpath, so assuming that the dependencies are set correctly everywhere
classpath.addAll(
OrderEnumerator.orderEntries(module).withoutSdk().classesRoots.mapNotNull {
it.canonicalPath?.removeSuffix("!/").let(::File)
}
)
orderEntriesForFile.forEach {
classpath.addAll(
OrderEnumerator.orderEntries(it.ownerModule).withoutSdk().classesRoots.mapNotNull {
it.canonicalPath?.removeSuffix("!/").let(::File)
}
)
}
}
}
.onProcessed {