From a40aeaaf25bd6abf1eaf403b0bd6390bbf1473bf Mon Sep 17 00:00:00 2001 From: nik Date: Thu, 12 Nov 2009 12:33:13 +0300 Subject: [PATCH] correctly handle module pointers if modifable model is disposed --- .../module/impl/ModulePointerManagerImpl.java | 29 ++++++++++++++++------ .../com/intellij/module/ModulePointerTest.java | 14 +++++++++++ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModulePointerManagerImpl.java b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModulePointerManagerImpl.java index eba14d8125..9380777413 100644 --- a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModulePointerManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModulePointerManagerImpl.java @@ -16,11 +16,13 @@ package com.intellij.openapi.module.impl; import com.intellij.ProjectTopics; +import com.intellij.openapi.Disposable; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModulePointer; import com.intellij.openapi.module.ModulePointerManager; import com.intellij.openapi.project.ModuleAdapter; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Disposer; import java.util.HashMap; import java.util.Map; @@ -38,11 +40,7 @@ public class ModulePointerManagerImpl extends ModulePointerManager { project.getMessageBus().connect().subscribe(ProjectTopics.MODULES, new ModuleAdapter() { @Override public void beforeModuleRemoved(Project project, Module module) { - final ModulePointerImpl pointer = myPointers.remove(module); - if (pointer != null) { - pointer.moduleRemoved(module); - myUnresolved.put(pointer.getModuleName(), pointer); - } + unregisterPointer(module); } @Override @@ -50,18 +48,35 @@ public class ModulePointerManagerImpl extends ModulePointerManager { final ModulePointerImpl pointer = myUnresolved.remove(module.getName()); if (pointer != null) { pointer.moduleAdded(module); - myPointers.put(module, pointer); + registerPointer(module, pointer); } } }); } + private void registerPointer(final Module module, final ModulePointerImpl pointer) { + myPointers.put(module, pointer); + Disposer.register(module, new Disposable() { + public void dispose() { + unregisterPointer(module); + } + }); + } + + private void unregisterPointer(Module module) { + final ModulePointerImpl pointer = myPointers.remove(module); + if (pointer != null) { + pointer.moduleRemoved(module); + myUnresolved.put(pointer.getModuleName(), pointer); + } + } + @Override public ModulePointer create(Module module) { ModulePointerImpl pointer = myPointers.get(module); if (pointer == null) { pointer = new ModulePointerImpl(module); - myPointers.put(module, pointer); + registerPointer(module, pointer); } return pointer; } diff --git a/platform/lang-impl/testSrc/com/intellij/module/ModulePointerTest.java b/platform/lang-impl/testSrc/com/intellij/module/ModulePointerTest.java index d6e2449422..a05e17a2d2 100644 --- a/platform/lang-impl/testSrc/com/intellij/module/ModulePointerTest.java +++ b/platform/lang-impl/testSrc/com/intellij/module/ModulePointerTest.java @@ -60,6 +60,20 @@ public class ModulePointerTest extends PlatformTestCase { assertEquals("xyz", pointer.getModuleName()); } + public void testDisposePointerFromUncommitedModifiableModel() throws Exception { + final ModifiableModuleModel modifiableModel = getModuleManager().getModifiableModel(); + final Module module = modifiableModel.newModule(myProject.getBaseDir().getPath() + "/xxx.iml", EmptyModuleType.getInstance()); + final ModulePointer pointer = getPointerManager().create(module); + + assertSame(module, pointer.getModule()); + assertEquals("xxx", pointer.getModuleName()); + + modifiableModel.dispose(); + + assertNull(pointer.getModule()); + assertEquals("xxx", pointer.getModuleName()); + } + private ModuleManager getModuleManager() { return ModuleManager.getInstance(myProject); } -- 2.11.4.GIT