From fb8c576f349173f29bd7ddf8fabd52c096ee852e Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 28 Mar 2017 15:25:32 +0300 Subject: [PATCH] project structure: don't recreate modifiable models during applying changes (IDEA-168208) Previously if someone tries to access ModuleRootModel after ModuleEditor.apply is called but before the model returned by it is committed (e.g. from myFacetsConfigurator.applyEditors) a new ModifiableRootModel instance will be created from the original ModuleRootModel, thus it won't include changes made in Project Structure dialog and may contain invalid OrderEntry instances. --- .../roots/ui/configuration/ModuleEditor.java | 23 ++++++++----------- .../ui/configuration/ModulesConfigurator.java | 3 +++ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModuleEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModuleEditor.java index b9ff883224ac..870410916037 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModuleEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModuleEditor.java @@ -318,24 +318,21 @@ public abstract class ModuleEditor implements Place.Navigator, Disposable { myGenericSettingsPanel = null; } finally { - myModifiableRootModel = null; - myModifiableRootModelProxy = null; + resetModifiableModel(); } } public ModifiableRootModel apply() throws ConfigurationException { - try { - for (ModuleConfigurationEditor editor : myEditors) { - editor.saveData(); - editor.apply(); - } + for (ModuleConfigurationEditor editor : myEditors) { + editor.saveData(); + editor.apply(); + } + return myModifiableRootModel; + } - return myModifiableRootModel; - } - finally { - myModifiableRootModel = null; - myModifiableRootModelProxy = null; - } + void resetModifiableModel() { + myModifiableRootModel = null; + myModifiableRootModelProxy = null; } public void canApply() throws ConfigurationException { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModulesConfigurator.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModulesConfigurator.java index c9ab97df0949..89fcc6036abb 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModulesConfigurator.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModulesConfigurator.java @@ -313,6 +313,9 @@ public class ModulesConfigurator implements ModulesProvider, ModuleEditor.Change try { ModifiableModelCommitter.multiCommit(models, myModuleModel); + for (ModuleEditor editor : myModuleEditors.values()) { + editor.resetModifiableModel(); + } myModuleModelCommitted = true; myFacetsConfigurator.commitFacets();