From 7c5a56dda11d707c15fdcfa0d4c85dbede01f279 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Tue, 20 Jun 2017 17:08:34 +0300 Subject: [PATCH] vcs: remove wrongful generics We can't give any warranties on actual type of ChangesBrowserNode, because we do not control actual tree building from List. Root node and "collapsed" FilePath nodes might violate this assumption even in the simplest cases. --- .../ui/views/DirectoryHistoryDialog.java | 4 +-- .../changes/conflicts/MoveChangesDialog.java | 5 ++- .../patch/ApplyPatchDifferentiatedDialog.java | 6 ++-- .../vcs/changes/ui/ChangesBrowser.java | 4 +-- .../vcs/changes/ui/ChangesBrowserBase.java | 8 ++--- .../vcs/changes/ui/ChangesTreeList.java | 31 +++++++++---------- .../changes/ui/FilePathChangesTreeList.java | 4 +-- .../changes/ui/MultipleChangeListBrowser.java | 4 +-- .../vcs/changes/ui/SelectFilesDialog.java | 4 +-- 9 files changed, 34 insertions(+), 36 deletions(-) diff --git a/platform/lvcs-impl/src/com/intellij/history/integration/ui/views/DirectoryHistoryDialog.java b/platform/lvcs-impl/src/com/intellij/history/integration/ui/views/DirectoryHistoryDialog.java index 859284d6d810..d41f69d77f9d 100644 --- a/platform/lvcs-impl/src/com/intellij/history/integration/ui/views/DirectoryHistoryDialog.java +++ b/platform/lvcs-impl/src/com/intellij/history/integration/ui/views/DirectoryHistoryDialog.java @@ -135,11 +135,11 @@ public class DirectoryHistoryDialog extends HistoryDialog getSelectedObjects(ChangesBrowserNode node) { + protected List getSelectedObjects(ChangesBrowserNode node) { return node.getAllChangesUnder(); } - protected Change getLeadSelectedObject(final ChangesBrowserNode node) { + protected Change getLeadSelectedObject(final ChangesBrowserNode node) { final Object o = node.getUserObject(); if (o instanceof Change) { return (Change)o; diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/conflicts/MoveChangesDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/conflicts/MoveChangesDialog.java index b1382f4f836e..5a734fdb2e75 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/conflicts/MoveChangesDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/conflicts/MoveChangesDialog.java @@ -18,7 +18,6 @@ package com.intellij.openapi.vcs.changes.conflicts; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.actionSystem.ActionManager; -import com.intellij.openapi.actionSystem.ActionPlaces; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; @@ -63,12 +62,12 @@ public class MoveChangesDialog extends DialogWrapper { } @Override - protected List getSelectedObjects(ChangesBrowserNode node) { + protected List getSelectedObjects(ChangesBrowserNode node) { return node.getAllChangesUnder(); } @Override - protected Change getLeadSelectedObject(ChangesBrowserNode node) { + protected Change getLeadSelectedObject(ChangesBrowserNode node) { final Object o = node.getUserObject(); if (o instanceof Change) { return (Change) o; diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchDifferentiatedDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchDifferentiatedDialog.java index 26886af9f531..ced1a4ca1fc9 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchDifferentiatedDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchDifferentiatedDialog.java @@ -585,13 +585,13 @@ public class ApplyPatchDifferentiatedDialog extends DialogWrapper { } @Override - protected List getSelectedObjects(ChangesBrowserNode node) { + protected List getSelectedObjects(ChangesBrowserNode node) { final List under = node.getAllChangesUnder(); return map(under, AbstractFilePatchInProgress.PatchChange.class::cast); } @Override - protected AbstractFilePatchInProgress.PatchChange getLeadSelectedObject(ChangesBrowserNode node) { + protected AbstractFilePatchInProgress.PatchChange getLeadSelectedObject(ChangesBrowserNode node) { final Object o = node.getUserObject(); if (o instanceof AbstractFilePatchInProgress.PatchChange) { return (AbstractFilePatchInProgress.PatchChange)o; @@ -600,7 +600,7 @@ public class ApplyPatchDifferentiatedDialog extends DialogWrapper { } @Override - protected boolean isNodeEnabled(ChangesBrowserNode node) { + protected boolean isNodeEnabled(ChangesBrowserNode node) { boolean enabled = super.isNodeEnabled(node); Object value = node.getUserObject(); if (value instanceof AbstractFilePatchInProgress.PatchChange) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowser.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowser.java index 03699be12565..6872c1524637 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowser.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowser.java @@ -50,12 +50,12 @@ public class ChangesBrowser extends ChangesBrowserBase { } @NotNull - protected List getSelectedObjects(@NotNull final ChangesBrowserNode node) { + protected List getSelectedObjects(@NotNull final ChangesBrowserNode node) { return node.getAllChangesUnder(); } @Nullable - protected Change getLeadSelectedObject(@NotNull final ChangesBrowserNode node) { + protected Change getLeadSelectedObject(@NotNull final ChangesBrowserNode node) { final Object o = node.getUserObject(); if (o instanceof Change) { return (Change)o; diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowserBase.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowserBase.java index 2dcb82b1f740..46c5d0106336 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowserBase.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesBrowserBase.java @@ -116,12 +116,12 @@ public abstract class ChangesBrowserBase extends JPanel implements TypeSafeDa return ChangesBrowserBase.this.buildTreeModel(changes, changeNodeDecorator, isShowFlatten()); } - protected List getSelectedObjects(final ChangesBrowserNode node) { + protected List getSelectedObjects(final ChangesBrowserNode node) { return ChangesBrowserBase.this.getSelectedObjects(node); } @Nullable - protected T getLeadSelectedObject(final ChangesBrowserNode node) { + protected T getLeadSelectedObject(final ChangesBrowserNode node) { return ChangesBrowserBase.this.getLeadSelectedObject(node); } @@ -151,10 +151,10 @@ public abstract class ChangesBrowserBase extends JPanel implements TypeSafeDa protected abstract DefaultTreeModel buildTreeModel(final List changes, ChangeNodeDecorator changeNodeDecorator, boolean showFlatten); @NotNull - protected abstract List getSelectedObjects(@NotNull ChangesBrowserNode node); + protected abstract List getSelectedObjects(@NotNull ChangesBrowserNode node); @Nullable - protected abstract T getLeadSelectedObject(@NotNull ChangesBrowserNode node); + protected abstract T getLeadSelectedObject(@NotNull ChangesBrowserNode node); @NotNull protected Runnable getDoubleClickHandler() { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesTreeList.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesTreeList.java index 89b742f945c4..2f7b7d8fc1cf 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesTreeList.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesTreeList.java @@ -292,7 +292,7 @@ public abstract class ChangesTreeList extends Tree implements TypeSafeDataPro return; } - TreeUtil.expandAll(ChangesTreeList.this); + TreeUtil.expandAll(this); int selectedTreeRow = -1; @@ -332,7 +332,7 @@ public abstract class ChangesTreeList extends Tree implements TypeSafeDataPro if (selectedTreeRow >= 0) { setSelectionRow(selectedTreeRow); } - TreeUtil.showRowCentered(ChangesTreeList.this, selectedTreeRow, false); + TreeUtil.showRowCentered(this, selectedTreeRow, false); } private int findRowContainingFile(@NotNull TreeNode root, @NotNull final VirtualFile toSelect) { @@ -390,7 +390,6 @@ public abstract class ChangesTreeList extends Tree implements TypeSafeDataPro else { LinkedHashSet changes = ContainerUtil.newLinkedHashSet(); for (TreePath path : paths) { - //noinspection unchecked changes.addAll(getSelectedObjects((ChangesBrowserNode)path.getLastPathComponent())); } return ContainerUtil.newArrayList(changes); @@ -404,10 +403,10 @@ public abstract class ChangesTreeList extends Tree implements TypeSafeDataPro return getChanges(); } - protected abstract List getSelectedObjects(final ChangesBrowserNode node); + protected abstract List getSelectedObjects(final ChangesBrowserNode node); @Nullable - protected abstract T getLeadSelectedObject(final ChangesBrowserNode node); + protected abstract T getLeadSelectedObject(final ChangesBrowserNode node); @Nullable public T getHighestLeadSelection() { @@ -415,15 +414,15 @@ public abstract class ChangesTreeList extends Tree implements TypeSafeDataPro if (path == null) { return null; } - //noinspection unchecked - return getLeadSelectedObject((ChangesBrowserNode)path.getLastPathComponent()); + + return getLeadSelectedObject((ChangesBrowserNode)path.getLastPathComponent()); } @Nullable public T getLeadSelection() { final TreePath path = getSelectionPath(); - //noinspection unchecked - return path == null ? null : ContainerUtil.getFirstItem(getSelectedObjects(((ChangesBrowserNode)path.getLastPathComponent()))); + + return path == null ? null : ContainerUtil.getFirstItem(getSelectedObjects(((ChangesBrowserNode)path.getLastPathComponent()))); } @NotNull @@ -565,7 +564,7 @@ public abstract class ChangesTreeList extends Tree implements TypeSafeDataPro @SuppressWarnings("unchecked") CheckboxTree.NodeState state = getNodeStatus((ChangesBrowserNode)value); myCheckBox.setSelected(state != CheckboxTree.NodeState.CLEAR); - //noinspection unchecked + myCheckBox.setEnabled(tree.isEnabled() && isNodeEnabled((ChangesBrowserNode)value)); revalidate(); @@ -583,7 +582,7 @@ public abstract class ChangesTreeList extends Tree implements TypeSafeDataPro } - private CheckboxTree.NodeState getNodeStatus(ChangesBrowserNode node) { + private CheckboxTree.NodeState getNodeStatus(ChangesBrowserNode node) { boolean hasIncluded = false; boolean hasExcluded = false; @@ -601,7 +600,7 @@ public abstract class ChangesTreeList extends Tree implements TypeSafeDataPro return CheckboxTree.NodeState.CLEAR; } - protected boolean isNodeEnabled(ChangesBrowserNode node) { + protected boolean isNodeEnabled(ChangesBrowserNode node) { return getNodeStatus(node) != CheckboxTree.NodeState.PARTIAL; } @@ -635,10 +634,10 @@ public abstract class ChangesTreeList extends Tree implements TypeSafeDataPro HashSet changesSet = new HashSet<>(changes); final List treeSelection = new ArrayList<>(changes.size()); TreeUtil.traverse(getRoot(), node -> { - @SuppressWarnings("unchecked") - final T change = (T) ((DefaultMutableTreeNode) node).getUserObject(); - if (changesSet.contains(change)) { - treeSelection.add(new TreePath(((DefaultMutableTreeNode) node).getPath())); + DefaultMutableTreeNode mutableNode = (DefaultMutableTreeNode)node; + //noinspection SuspiciousMethodCalls + if (changesSet.contains(mutableNode.getUserObject())) { + treeSelection.add(new TreePath(mutableNode.getPath())); } return true; }); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/FilePathChangesTreeList.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/FilePathChangesTreeList.java index 5f79ab577996..575c0812ec07 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/FilePathChangesTreeList.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/FilePathChangesTreeList.java @@ -35,12 +35,12 @@ public class FilePathChangesTreeList extends ChangesTreeList { return TreeModelBuilder.buildFromFilePaths(myProject, isShowFlatten(), changes); } - protected List getSelectedObjects(final ChangesBrowserNode node) { + protected List getSelectedObjects(final ChangesBrowserNode node) { return node.getAllFilePathsUnder(); } @Nullable - protected FilePath getLeadSelectedObject(final ChangesBrowserNode node) { + protected FilePath getLeadSelectedObject(final ChangesBrowserNode node) { Object userObject = node.getUserObject(); return userObject instanceof FilePath ? (FilePath)userObject : null; } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/MultipleChangeListBrowser.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/MultipleChangeListBrowser.java index e3a5c780aae3..a41544be09ba 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/MultipleChangeListBrowser.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/MultipleChangeListBrowser.java @@ -204,7 +204,7 @@ public class MultipleChangeListBrowser extends ChangesBrowserBase { @NotNull @Override - protected List getSelectedObjects(@NotNull ChangesBrowserNode node) { + protected List getSelectedObjects(@NotNull ChangesBrowserNode node) { List result = ContainerUtil.newArrayList(); result.addAll(node.getAllChangesUnder()); @@ -217,7 +217,7 @@ public class MultipleChangeListBrowser extends ChangesBrowserBase { @Nullable @Override - protected Object getLeadSelectedObject(@NotNull ChangesBrowserNode node) { + protected Object getLeadSelectedObject(@NotNull ChangesBrowserNode node) { Object result = null; Object userObject = node.getUserObject(); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/SelectFilesDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/SelectFilesDialog.java index 7b9bb140c5fe..3b11968ee312 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/SelectFilesDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/SelectFilesDialog.java @@ -105,11 +105,11 @@ public class SelectFilesDialog extends AbstractSelectFilesDialog { return TreeModelBuilder.buildFromVirtualFiles(myProject, isShowFlatten(), changes); } - protected List getSelectedObjects(final ChangesBrowserNode node) { + protected List getSelectedObjects(final ChangesBrowserNode node) { return node.getAllFilesUnder(); } - protected VirtualFile getLeadSelectedObject(final ChangesBrowserNode node) { + protected VirtualFile getLeadSelectedObject(final ChangesBrowserNode node) { final Object o = node.getUserObject(); if (o instanceof VirtualFile) { return (VirtualFile) o;