From b556edfa9768091efa510779fb8cd3ef95bb5fdf Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Fri, 16 Dec 2016 11:29:13 +0100 Subject: [PATCH] =?UTF-8?q?avoid=20linear=20search=20=E2=80=94=20added/rem?= =?UTF-8?q?oved=20modules?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/impl/ModuleManagerImpl.java | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java index e208cefad6f1..2be30baf2073 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java @@ -934,10 +934,21 @@ public abstract class ModuleManagerImpl extends ModuleManager implements Project ApplicationManager.getApplication().assertWriteAccessAllowed(); final Collection oldModules = myModuleModel.myModules.values(); final Collection newModules = moduleModel.myModules.values(); - final List removedModules = new ArrayList<>(oldModules); - removedModules.removeAll(newModules); - final List addedModules = new ArrayList<>(newModules); - addedModules.removeAll(oldModules); + + final Collection addedModules; + final Collection removedModules; + if (oldModules.isEmpty()) { + // create immutable copy + addedModules = new ArrayList<>(newModules); + removedModules = Collections.emptyList(); + } + else { + addedModules = new THashSet<>(newModules); + addedModules.removeAll(oldModules); + + removedModules = new THashSet<>(oldModules); + removedModules.removeAll(newModules); + } ProjectRootManagerEx.getInstanceEx(myProject).makeRootsChange(() -> { for (Module removedModule : removedModules) { @@ -945,11 +956,13 @@ public abstract class ModuleManagerImpl extends ModuleManager implements Project cleanCachedStuff(); } - List neverAddedModules = new ArrayList<>(moduleModel.myModulesToDispose); - neverAddedModules.removeAll(myModuleModel.myModules.values()); - for (final Module neverAddedModule : neverAddedModules) { - neverAddedModule.putUserData(DISPOSED_MODULE_NAME, neverAddedModule.getName()); - Disposer.dispose(neverAddedModule); + if (!moduleModel.myModulesToDispose.isEmpty()) { + List neverAddedModules = new ArrayList<>(moduleModel.myModulesToDispose); + neverAddedModules.removeAll(myModuleModel.myModules.values()); + for (final Module neverAddedModule : neverAddedModules) { + neverAddedModule.putUserData(DISPOSED_MODULE_NAME, neverAddedModule.getName()); + Disposer.dispose(neverAddedModule); + } } if (runnable != null) {