Program: 93013
Project: 93013
Buggy source:
/** 
 * Recursively collapses all children of node id, and puts them in the collapsedCallees list of id. At the end of this run, each collapsed node will have a list of other collapsed nodes AND a list of non-collapsed nodes. So will node #id. Uncollapsed nodes, however, will not have a list of collapsed nodes attached. 
 * @param ID of node to start from (use getFirstUsefulNode() to collapse everything
 * @return True if successful
 */
public boolean recursivelyCollapseAllChildrenOfNode(int id){
  setCollapseMode(true);
  if (nodeDataMap.get(id).hasCollapsedChildren || nodeDataMap.get(id).children.size() == 0)   return true;
  nodeDataMap.get(id).hasCollapsedChildren=true;
  HashMap<String,Integer> newNodeMap=new HashMap<String,Integer>();
  HashMap<Integer,Integer> collapsedNodesWithOnlyOneNodeInThem=new HashMap<Integer,Integer>();
  int size=nodeDataMap.get(id).children.size();
  for (int i=0; i < size; i++) {
    int childID=nodeDataMap.get(id).children.get(i);
    int childLevel=getLevelOfNode(childID);
    if (collapsedLevelSize.get(childLevel) == null)     collapsedLevelSize.put(childLevel,0);
    String nodeName=nodeDataMap.get(childID).name;
    if (newNodeMap.get(nodeName) != null) {
      int aggregateID=newNodeMap.get(nodeName);
      if (collapsedNodesWithOnlyOneNodeInThem.get(aggregateID) != null) {
        this.loadData(SWT.NONE,aggregateID,nodeName,nodeDataMap.get(childID).time,nodeDataMap.get(childID).timesCalled,id,nodeDataMap.get(childID).isMarked(),"String_Node_Str");
        if (getNodeData(aggregateID).isMarked()) {
          markedCollapsedNodes.add(aggregateID);
          markedNodes.remove((Integer)aggregateID);
        }
        nodeDataMap.get(id).children.remove((Integer)aggregateID);
        nodeDataMap.get(id).collapsedChildren.add(aggregateID);
        nodeDataMap.get(aggregateID).collapsedParent=id;
        int otherChildID=collapsedNodesWithOnlyOneNodeInThem.get(aggregateID);
        aggregateData(nodeDataMap.get(aggregateID),nodeDataMap.get(otherChildID));
        collapsedNodesWithOnlyOneNodeInThem.remove(aggregateID);
        nodeDataMap.get(aggregateID).children.addAll(nodeDataMap.get(otherChildID).children);
        nodeDataMap.get(otherChildID).setPartOfCollapsedNode(aggregateID);
        nodeDataMap.get(aggregateID).uncollapsedPiece=otherChildID;
      }
 else       aggregateData(nodeDataMap.get(aggregateID),nodeDataMap.get(childID));
      nodeDataMap.get(aggregateID).children.addAll(nodeDataMap.get(childID).children);
      nodeDataMap.get(aggregateID).isCollapsed=true;
      if (nodeMap.get(childID) != null) {
        nodeMap.get(childID).setLocation(nodeMap.get(id).getLocation().x - nodeMap.get(id).getSize().width,nodeMap.get(id).getLocation().y);
      }
      nodeDataMap.get(childID).setPartOfCollapsedNode(aggregateID);
    }
 else {
      idOfLastNode++;
      newNodeMap.put(nodeName,idOfLastNode);
      collapsedNodesWithOnlyOneNodeInThem.put(idOfLastNode,childID);
      if (nodeMap.get(childID) != null) {
        nodeMap.get(childID).setLocation(nodeMap.get(id).getLocation().x,nodeMap.get(id).getLocation().y);
      }
      int tmp=collapsedLevelSize.get(childLevel) + 1;
      collapsedLevelSize.put(childLevel,tmp);
    }
  }
  for (  int i : collapsedNodesWithOnlyOneNodeInThem.keySet()) {
    int childID=collapsedNodesWithOnlyOneNodeInThem.get(i);
    nodeDataMap.get(childID).onlyChildWithThisName=true;
    nodeDataMap.get(id).collapsedChildren.add(childID);
    newNodeMap.remove(nodeDataMap.get(childID).name);
    nodeDataMap.get(childID).collapsedParent=id;
    if (getNodeData(childID).isMarked())     markedCollapsedNodes.add(childID);
  }
  for (  int i : nodeDataMap.get(id).collapsedChildren) {
    recursivelyCollapseAllChildrenOfNode(i);
  }
  nodeDataMap.get(id).sortByTime();
  collapsedNodesWithOnlyOneNodeInThem.clear();
  newNodeMap.clear();
  nodeDataMap.get(id).hasCollapsedChildren=true;
  return true;
}

Fixed version (ground truth):
/** 
 * Recursively collapses all children of node id, and puts them in the collapsedCallees list of id. At the end of this run, each collapsed node will have a list of other collapsed nodes AND a list of non-collapsed nodes. So will node #id. Uncollapsed nodes, however, will not have a list of collapsed nodes attached. 
 * @param ID of node to start from (use getFirstUsefulNode() to collapse everything
 * @return True if successful
 */
public boolean recursivelyCollapseAllChildrenOfNode(int id){
  setCollapseMode(true);
  if (nodeDataMap.get(id).hasCollapsedChildren || nodeDataMap.get(id).children.size() == 0)   return true;
  nodeDataMap.get(id).hasCollapsedChildren=true;
  HashMap<String,Integer> newNodeMap=new HashMap<String,Integer>();
  HashMap<Integer,Integer> collapsedNodesWithOnlyOneNodeInThem=new HashMap<Integer,Integer>();
  int size=nodeDataMap.get(id).children.size();
  for (int i=0; i < size; i++) {
    int childID=nodeDataMap.get(id).children.get(i);
    int childLevel=getLevelOfNode(childID);
    if (collapsedLevelSize.get(childLevel) == null)     collapsedLevelSize.put(childLevel,0);
    String nodeName=nodeDataMap.get(childID).name;
    if (newNodeMap.get(nodeName) != null) {
      int aggregateID=newNodeMap.get(nodeName);
      if (collapsedNodesWithOnlyOneNodeInThem.get(aggregateID) != null) {
        this.loadData(SWT.NONE,aggregateID,nodeName,nodeDataMap.get(childID).time,nodeDataMap.get(childID).timesCalled,id,nodeDataMap.get(childID).isMarked(),"String_Node_Str");
        if (getNodeData(aggregateID).isMarked()) {
          markedCollapsedNodes.add(aggregateID);
          markedNodes.remove((Integer)aggregateID);
        }
        nodeDataMap.get(id).children.remove((Integer)aggregateID);
        nodeDataMap.get(id).collapsedChildren.add(aggregateID);
        nodeDataMap.get(childID).setPartOfCollapsedNode(aggregateID);
        nodeDataMap.get(aggregateID).collapsedParent=id;
        int otherChildID=collapsedNodesWithOnlyOneNodeInThem.get(aggregateID);
        aggregateData(nodeDataMap.get(aggregateID),nodeDataMap.get(otherChildID));
        collapsedNodesWithOnlyOneNodeInThem.remove(aggregateID);
        nodeDataMap.get(aggregateID).children.addAll(nodeDataMap.get(otherChildID).children);
        nodeDataMap.get(aggregateID).setPartOfCollapsedNode(StapData.NOT_PART_OF_COLLAPSED_NODE);
        nodeDataMap.get(otherChildID).setPartOfCollapsedNode(aggregateID);
        nodeDataMap.get(aggregateID).uncollapsedPiece=otherChildID;
      }
 else       aggregateData(nodeDataMap.get(aggregateID),nodeDataMap.get(childID));
      nodeDataMap.get(aggregateID).children.addAll(nodeDataMap.get(childID).children);
      nodeDataMap.get(aggregateID).isCollapsed=true;
      if (nodeMap.get(childID) != null) {
        nodeMap.get(childID).setLocation(nodeMap.get(id).getLocation().x - nodeMap.get(id).getSize().width,nodeMap.get(id).getLocation().y);
      }
      nodeDataMap.get(childID).setPartOfCollapsedNode(aggregateID);
    }
 else {
      idOfLastNode++;
      newNodeMap.put(nodeName,idOfLastNode);
      collapsedNodesWithOnlyOneNodeInThem.put(idOfLastNode,childID);
      if (nodeMap.get(childID) != null) {
        nodeMap.get(childID).setLocation(nodeMap.get(id).getLocation().x,nodeMap.get(id).getLocation().y);
      }
      int tmp=collapsedLevelSize.get(childLevel) + 1;
      collapsedLevelSize.put(childLevel,tmp);
    }
  }
  for (  int i : collapsedNodesWithOnlyOneNodeInThem.keySet()) {
    int childID=collapsedNodesWithOnlyOneNodeInThem.get(i);
    nodeDataMap.get(childID).onlyChildWithThisName=true;
    nodeDataMap.get(id).collapsedChildren.add(childID);
    newNodeMap.remove(nodeDataMap.get(childID).name);
    nodeDataMap.get(childID).collapsedParent=id;
    nodeDataMap.get(childID).setPartOfCollapsedNode(childID);
    if (getNodeData(childID).isMarked())     markedCollapsedNodes.add(childID);
  }
  for (  int i : nodeDataMap.get(id).collapsedChildren) {
    recursivelyCollapseAllChildrenOfNode(i);
  }
  nodeDataMap.get(id).sortByTime();
  collapsedNodesWithOnlyOneNodeInThem.clear();
  newNodeMap.clear();
  nodeDataMap.get(id).hasCollapsedChildren=true;
  return true;
}