mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
avoid double dispose in case of Disposer.register(d, ()->Disposer.dispose(t)) abomination
This commit is contained in:
@@ -107,6 +107,7 @@ final class ObjectNode<T> {
|
||||
ObjectTree.executeActionWithRecursiveGuard(this, myTree.getNodesInExecution(), new ObjectTreeAction<ObjectNode<T>>() {
|
||||
@Override
|
||||
public void execute(@NotNull ObjectNode<T> each) {
|
||||
if (myTree.getDisposalInfo(myObject) != null) return; // already disposed. may happen when someone does `register(obj, ()->Disposer.dispose(t));` abomination
|
||||
try {
|
||||
action.beforeTreeExecution(myObject);
|
||||
}
|
||||
@@ -167,7 +168,7 @@ final class ObjectNode<T> {
|
||||
}
|
||||
}
|
||||
|
||||
private void removeFromObjectTree() {
|
||||
void removeFromObjectTree() {
|
||||
synchronized (myTree.treeLock) {
|
||||
myTree.putNode(myObject, null);
|
||||
if (myParent == null) {
|
||||
|
||||
@@ -94,6 +94,16 @@ public class DisposerTest extends TestCase {
|
||||
assertEquals(Arrays.asList(myFolder2, myLeaf1, myFolder1, myRoot), myDisposedObjects);
|
||||
}
|
||||
|
||||
public void testDisposalOrderNestedDispose() {
|
||||
Disposer.register(myRoot, myFolder2);
|
||||
//noinspection SSBasedInspection
|
||||
Disposer.register(myRoot, () -> Disposer.dispose(myFolder2));
|
||||
|
||||
Disposer.dispose(myRoot);
|
||||
|
||||
assertEquals(Arrays.asList(myFolder2, myRoot), myDisposedObjects);
|
||||
}
|
||||
|
||||
public void testDirectCallOfDisposable() {
|
||||
SelDisposable selfDisposable = new SelDisposable("selfDisposable");
|
||||
Disposer.register(myRoot, selfDisposable);
|
||||
|
||||
Reference in New Issue
Block a user