more correct inline nodes comparison - do not allow two same nodes on one line appcode/142.2087
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Fri, 29 May 2015 17:32:11 +0000 (20:32 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Fri, 29 May 2015 17:33:04 +0000 (20:33 +0300)
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesView.java

index 637f71ad105d400a7b94ed51cf55f8da786947e7..2f8bdb668e9c4fe3bc8be6b61053ecdabbf09e30 100644 (file)
@@ -110,7 +110,7 @@ public class XVariablesView extends XVariablesViewBase {
       = new THashMap<Pair<VirtualFile, Integer>, Set<Entry>>();
 
     @Nullable
-    public List<XValueNodeImpl> get(VirtualFile file, int line) {
+    public List<XValueNodeImpl> get(@NotNull VirtualFile file, int line) {
       synchronized (myData) {
         Set<Entry> entries = myData.get(Pair.create(file, line));
         if (entries == null) return null;
@@ -123,7 +123,7 @@ public class XVariablesView extends XVariablesViewBase {
       }
     }
 
-    public void put(VirtualFile file, XSourcePosition position, XValueNodeImpl node) {
+    public void put(@NotNull VirtualFile file, @NotNull XSourcePosition position, @NotNull XValueNodeImpl node) {
       synchronized (myData) {
         Pair<VirtualFile, Integer> key = Pair.create(file, position.getLine());
         Set<Entry> entries = myData.get(key);
@@ -139,19 +139,37 @@ public class XVariablesView extends XVariablesViewBase {
       private final long myOffset;
       private final XValueNodeImpl myNode;
 
-      public Entry(long offset, XValueNodeImpl node) {
+      public Entry(long offset, @NotNull XValueNodeImpl node) {
         myOffset = offset;
         myNode = node;
       }
 
       @Override
       public int compareTo(Entry o) {
+        if (myNode == o.myNode) return 0;
         int res = Comparing.compare(myOffset, o.myOffset);
         if (res == 0) {
           return XValueNodeImpl.COMPARATOR.compare(myNode, o.myNode);
         }
         return res;
       }
+
+      @Override
+      public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        Entry entry = (Entry)o;
+
+        if (!myNode.equals(entry.myNode)) return false;
+
+        return true;
+      }
+
+      @Override
+      public int hashCode() {
+        return myNode.hashCode();
+      }
     }
   }
 }