IJPL-182721: Fix RubyMine indexing degradation and remove custom processing for global libraries and SDKs

GitOrigin-RevId: f99fc02200f9a3ef065c5f20d4744aaba449226e
This commit is contained in:
Ilya Korennoy
2025-04-15 12:33:55 +02:00
committed by intellij-monorepo-bot
parent f84c9164c0
commit cbd1a11c19
5 changed files with 52 additions and 25 deletions

View File

@@ -151,7 +151,7 @@ public class RootsChangedTest extends JavaModuleTestCase {
sdkModificator.commitChanges();
});
myModuleRootListener.assertEventsCount(1);
myModuleRootListener.assertEventsCount(2);
}
public void testModuleJdkEditing() {
@@ -177,7 +177,7 @@ public class RootsChangedTest extends JavaModuleTestCase {
final SdkModificator sdkModificator = jdk.getSdkModificator();
sdkModificator.addRoot(getTempDir().createVirtualDir(), OrderRootType.CLASSES);
sdkModificator.commitChanges();
myModuleRootListener.assertEventsCount(1);
myModuleRootListener.assertEventsCount(2);
final SdkModificator sdkModificator2 = unused.getSdkModificator();
sdkModificator2.addRoot(getTempDir().createVirtualDir(), OrderRootType.CLASSES);
@@ -201,12 +201,12 @@ public class RootsChangedTest extends JavaModuleTestCase {
Sdk jdk = ProjectJdkTable.getInstance().createSdk("new-jdk", JavaSdk.getInstance());
ProjectJdkTable.getInstance().addJdk(jdk, getTestRootDisposable());
myModuleRootListener.assertEventsCount(1);
myModuleRootListener.assertEventsCount(2);
final SdkModificator sdkModificator = jdk.getSdkModificator();
sdkModificator.addRoot(getTempDir().createVirtualDir(), OrderRootType.CLASSES);
sdkModificator.commitChanges();
myModuleRootListener.assertEventsCount(1);
myModuleRootListener.assertEventsCount(2);
});
}
@@ -243,7 +243,7 @@ public class RootsChangedTest extends JavaModuleTestCase {
final SdkModificator sdkModificator = jdk.getSdkModificator();
sdkModificator.addRoot(getTempDir().createVirtualDir(), OrderRootType.CLASSES);
sdkModificator.commitChanges();
myModuleRootListener.assertEventsCount(1);
myModuleRootListener.assertEventsCount(2);
});
}

View File

@@ -12,6 +12,7 @@ import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.RootsChangeRescanningInfo
import com.intellij.openapi.roots.AdditionalLibraryRootsProvider
import com.intellij.openapi.util.registry.Registry
import com.intellij.openapi.util.text.StringUtil
import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.openapi.vfs.VirtualFile
@@ -412,7 +413,8 @@ class ProjectEntityIndexingService(
private fun <E : WorkspaceEntity> isLibraryIgnoredByLibraryRootFileIndexContributor(newEntity: E): Boolean {
return newEntity is LibraryEntity &&
(newEntity as LibraryEntity).symbolicId.tableId is GlobalLibraryTableId
(newEntity as LibraryEntity).symbolicId.tableId is GlobalLibraryTableId &&
!Registry.`is`("ide.workspace.model.sdk.remove.custom.processing")
}
private fun <E : WorkspaceEntity, C : WorkspaceEntity> handleDependencies(

View File

@@ -118,18 +118,18 @@ public final class IndexableFilesIndexImpl implements IndexableFilesIndex {
ProgressManager.checkCanceled();
iterators.addAll(IndexableEntityProviderMethods.INSTANCE.createIterators(sdk));
}
}
LibraryTablesRegistrar tablesRegistrar = LibraryTablesRegistrar.getInstance();
Sequence<LibraryTable> libs = SequencesKt.asSequence(tablesRegistrar.getCustomLibraryTables().iterator());
libs = SequencesKt.plus(libs, tablesRegistrar.getLibraryTable());
for (LibraryTable libraryTable : SequencesKt.asIterable(libs)) {
for (Library library : libraryTable.getLibraries()) {
ProgressManager.checkCanceled();
if (moduleDependencyIndex.hasDependencyOn(library)) {
for (IndexableFilesIterator iterator : Companion.createIteratorList(library)) {
if (libraryOrigins.add(iterator.getOrigin())) {
iterators.add(iterator);
LibraryTablesRegistrar tablesRegistrar = LibraryTablesRegistrar.getInstance();
Sequence<LibraryTable> libs = SequencesKt.asSequence(tablesRegistrar.getCustomLibraryTables().iterator());
libs = SequencesKt.plus(libs, tablesRegistrar.getLibraryTable());
for (LibraryTable libraryTable : SequencesKt.asIterable(libs)) {
for (Library library : libraryTable.getLibraries()) {
ProgressManager.checkCanceled();
if (moduleDependencyIndex.hasDependencyOn(library)) {
for (IndexableFilesIterator iterator : Companion.createIteratorList(library)) {
if (libraryOrigins.add(iterator.getOrigin())) {
iterators.add(iterator);
}
}
}
}

View File

@@ -300,8 +300,29 @@ internal class WorkspaceIndexingRootsBuilder(private val ignoreModuleRoots: Bool
builders.addAll(forModuleRootsFileBased((entry.key as ModuleBridge).moduleEntityId, entry.value))
}
val moduleDependencyIndex = ModuleDependencyIndex.getInstance(project)
for (description in descriptions) {
builders.addAll(description.createBuilders())
when (description) {
is LibraryRootsDescription -> {
if (moduleDependencyIndex.hasDependencyOn(description.library.symbolicId)) {
builders.addAll(description.createBuilders())
}
}
is LibraryUrlRootsDescription -> {
if (moduleDependencyIndex.hasDependencyOn(description.library.symbolicId)) {
builders.addAll(description.createBuilders())
}
}
is SdkRootsDescription -> {
if (moduleDependencyIndex.hasDependencyOn(description.sdk.symbolicId)) {
builders.addAll(description.createBuilders())
}
}
else -> {
builders.addAll(description.createBuilders())
}
}
}
builders.addAll(ReincludedRootsUtil.createBuildersForReincludedFiles(project, reincludedRoots))
@@ -327,16 +348,20 @@ internal class WorkspaceIndexingRootsBuilder(private val ignoreModuleRoots: Bool
is EntityContentRootsCustomizedModuleAwareDescription<*> -> contentIterators.addAll(description.createIterators())
is EntityGenericContentRootsDescription<*> -> contentIterators.addAll(description.createIterators())
is LibraryRootsDescription -> {
description.createIterators(storage).forEach { iterator ->
if (libraryOriginsToFilterDuplicates.add(iterator.origin)) {
externalIterators.add(iterator)
if (moduleDependencyIndex.hasDependencyOn(description.library.symbolicId)) {
description.createIterators(storage).forEach { iterator ->
if (libraryOriginsToFilterDuplicates.add(iterator.origin)) {
externalIterators.add(iterator)
}
}
}
}
is LibraryUrlRootsDescription -> {
description.createIterators(storage).forEach { iterator ->
if (libraryOriginsToFilterDuplicates.add(iterator.origin)) {
externalIterators.add(iterator)
if (moduleDependencyIndex.hasDependencyOn(description.library.symbolicId)) {
description.createIterators(storage).forEach { iterator ->
if (libraryOriginsToFilterDuplicates.add(iterator.origin)) {
externalIterators.add(iterator)
}
}
}
}

View File

@@ -46,7 +46,7 @@
description="Enable workspace model checking for listeners that execute more than 200ms"/>
<registryKey key="ide.workspace.model.assertions.bridges.usage" defaultValue="false" restartRequired="true"
description="Enable workspace model checking for accessing bridges from WSM listeners"/>
<registryKey key="ide.workspace.model.sdk.remove.custom.processing" defaultValue="false" restartRequired="true"
<registryKey key="ide.workspace.model.sdk.remove.custom.processing" defaultValue="true" restartRequired="true"
description="Removes custom processing of Global Libraries and SDKs in the Workspace Model"/>
<registryKey key="ide.workspace.model.per.environment.model.separation" defaultValue="false" restartRequired="true"
description="Enable existence of multiple workspace models, one per each isolated environment"/>