From 5b6c41cdef413bd5c5df388895ec642c05ea4435 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Tue, 25 Aug 2015 15:02:52 +0300 Subject: [PATCH] merge: fix NPE if UndoManager not found --- .../intellij/diff/merge/TextMergeTool.java | 42 ++++++++----------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/platform/diff-impl/src/com/intellij/diff/merge/TextMergeTool.java b/platform/diff-impl/src/com/intellij/diff/merge/TextMergeTool.java index 26e58ddabf0e..a82a03b741c4 100644 --- a/platform/diff-impl/src/com/intellij/diff/merge/TextMergeTool.java +++ b/platform/diff-impl/src/com/intellij/diff/merge/TextMergeTool.java @@ -200,6 +200,7 @@ public class TextMergeTool implements MergeTool { public class MyThreesideViewer extends ThreesideTextDiffViewerEx { @NotNull private final ModifierProvider myModifierProvider; + @Nullable private final UndoManager myUndoManager; // all changes - both applied and unapplied ones @NotNull private final List myAllMergeChanges = new ArrayList(); @@ -217,14 +218,17 @@ public class TextMergeTool implements MergeTool { super(context, request); myModifierProvider = new ModifierProvider(); + myUndoManager = getProject() != null ? UndoManager.getInstance(getProject()) : UndoManager.getGlobalInstance(); DiffUtil.registerAction(new ApplySelectedChangesAction(Side.LEFT, true), myPanel); DiffUtil.registerAction(new ApplySelectedChangesAction(Side.RIGHT, true), myPanel); DiffUtil.registerAction(new IgnoreSelectedChangesAction(Side.LEFT, true), myPanel); DiffUtil.registerAction(new IgnoreSelectedChangesAction(Side.RIGHT, true), myPanel); - new UndoRedoAction(true).register(); - new UndoRedoAction(false).register(); + if (myUndoManager != null) { + new UndoRedoAction(true).register(); + new UndoRedoAction(false).register(); + } } @Override @@ -333,10 +337,9 @@ public class TextMergeTool implements MergeTool { @Override public void run() { outputDocument.setText(baseDocument.getCharsSequence()); - UndoManager undoManager = getProject() != null ? UndoManager.getInstance(getProject()) : UndoManager.getGlobalInstance(); - if (undoManager != null) { + if (myUndoManager != null) { DocumentReference ref = DocumentReferenceManager.getInstance().create(outputDocument); - undoManager.nonundoableActionPerformed(ref, false); + myUndoManager.nonundoableActionPerformed(ref, false); } } }); @@ -513,10 +516,10 @@ public class TextMergeTool implements MergeTool { } } - if (!corruptedStates.isEmpty()) { + if (!corruptedStates.isEmpty() && myUndoManager != null) { // document undo is registered inside onDocumentChange, so our undo() will be called after its undo(). // thus thus we can avoid checks for isUndoInProgress() (to avoid modification of the same TextMergeChange by this listener) - UndoManager.getInstance(getProject()).undoableActionPerformed(new BasicUndoableAction(getEditor(ThreeSide.BASE).getDocument()) { + myUndoManager.undoableActionPerformed(new BasicUndoableAction(getEditor(ThreeSide.BASE).getDocument()) { @Override public void undo() throws UnexpectedUndoException { enterBulkChangeUpdateBlock(); @@ -701,10 +704,7 @@ public class TextMergeTool implements MergeTool { } private void registerUndoRedo(final boolean undo) { - Project project = getProject(); - if (project == null) { - return; - } + if (myUndoManager == null) return; List affectedChanges = getAffectedChanges(); final List states = new ArrayList(affectedChanges.size()); @@ -712,7 +712,7 @@ public class TextMergeTool implements MergeTool { states.add(change.storeState()); } - UndoManager.getInstance(project).undoableActionPerformed(new BasicUndoableAction(myDocument) { + myUndoManager.undoableActionPerformed(new BasicUndoableAction(myDocument) { @Override public void undo() throws UnexpectedUndoException { if (undo) restoreStates(states); @@ -1185,22 +1185,20 @@ public class TextMergeTool implements MergeTool { @Override public void update(AnActionEvent e) { - UndoManager undoManager = getUndoManager(); + assert myUndoManager != null; TextEditor textEditor = getTextEditor(); - - e.getPresentation().setEnabled(myUndo ? undoManager.isUndoAvailable(textEditor) : undoManager.isRedoAvailable(textEditor)); + e.getPresentation().setEnabled(myUndo ? myUndoManager.isUndoAvailable(textEditor) : myUndoManager.isRedoAvailable(textEditor)); } @Override public void actionPerformed(AnActionEvent e) { - UndoManager undoManager = getUndoManager(); + assert myUndoManager != null; TextEditor textEditor = getTextEditor(); - if (myUndo) { - undoManager.undo(textEditor); + myUndoManager.undo(textEditor); } else { - undoManager.redo(textEditor); + myUndoManager.redo(textEditor); } } @@ -1209,12 +1207,6 @@ public class TextMergeTool implements MergeTool { EditorEx editor = getEditor(ThreeSide.BASE); return TextEditorProvider.getInstance().getTextEditor(editor); } - - @NotNull - private UndoManager getUndoManager() { - Project project = getProject(); - return project != null ? UndoManager.getInstance(project) : UndoManager.getGlobalInstance(); - } } private class MyDividerPaintable implements DiffDividerDrawUtil.DividerPaintable {