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:
+18
-12
@@ -10,10 +10,7 @@ import com.intellij.openapi.application.ApplicationManager
|
|||||||
import com.intellij.openapi.application.ReadAction
|
import com.intellij.openapi.application.ReadAction
|
||||||
import com.intellij.openapi.diagnostic.Logger
|
import com.intellij.openapi.diagnostic.Logger
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.roots.ModuleRootEvent
|
import com.intellij.openapi.roots.*
|
||||||
import com.intellij.openapi.roots.ModuleRootListener
|
|
||||||
import com.intellij.openapi.roots.OrderEnumerator
|
|
||||||
import com.intellij.openapi.roots.ProjectFileIndex
|
|
||||||
import com.intellij.openapi.vfs.*
|
import com.intellij.openapi.vfs.*
|
||||||
import com.intellij.util.concurrency.AppExecutorUtil
|
import com.intellij.util.concurrency.AppExecutorUtil
|
||||||
import com.intellij.util.indexing.FileBasedIndex
|
import com.intellij.util.indexing.FileBasedIndex
|
||||||
@@ -123,31 +120,40 @@ class ScriptTemplatesFromDependenciesProvider(private val project: Project) : Sc
|
|||||||
.expireWith(project)
|
.expireWith(project)
|
||||||
.submit(AppExecutorUtil.getAppExecutorService())
|
.submit(AppExecutorUtil.getAppExecutorService())
|
||||||
.onSuccess { roots ->
|
.onSuccess { roots ->
|
||||||
val jarFS = JarFileSystem.getInstance()
|
|
||||||
roots.forEach { root ->
|
roots.forEach { root ->
|
||||||
if (logger.isDebugEnabled) {
|
if (logger.isDebugEnabled) {
|
||||||
logger.debug("root matching SCRIPT_DEFINITION_MARKERS_PATH found: ${root.path}")
|
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 ->
|
root.findFileByRelativePath(SCRIPT_DEFINITION_MARKERS_PATH)?.children?.forEach { resourceFile ->
|
||||||
if (resourceFile.isValid && !resourceFile.isDirectory) {
|
if (resourceFile.isValid && !resourceFile.isDirectory) {
|
||||||
templates.add(resourceFile.name.removeSuffix(SCRIPT_DEFINITION_MARKERS_EXTENSION_WITH_DOT))
|
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
|
// assuming that all libraries are placed into classes roots
|
||||||
// TODO: extract exact library dependencies instead of putting all module dependencies into classpath
|
// 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
|
// 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
|
// 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
|
// the other has properly configured classpath, so assuming that the dependencies are set correctly everywhere
|
||||||
classpath.addAll(
|
orderEntriesForFile.forEach {
|
||||||
OrderEnumerator.orderEntries(module).withoutSdk().classesRoots.mapNotNull {
|
classpath.addAll(
|
||||||
it.canonicalPath?.removeSuffix("!/").let(::File)
|
OrderEnumerator.orderEntries(it.ownerModule).withoutSdk().classesRoots.mapNotNull {
|
||||||
}
|
it.canonicalPath?.removeSuffix("!/").let(::File)
|
||||||
)
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onProcessed {
|
.onProcessed {
|
||||||
|
|||||||
Reference in New Issue
Block a user