Program: 170728
Project: 170728
Buggy source:
@SuppressWarnings("String_Node_Str") public MethodInfo(ClassNode owner,List<MethodNode> methods){
  MethodInfo info=this;
  setOnMouseClicked(new EventHandler<MouseEvent>(){
    @Override public void handle(    MouseEvent e){
      if ((e.getClickCount() == 2 && e.getButton() == MouseButton.PRIMARY) || (e.getButton() == MouseButton.MIDDLE)) {
        MethodNode mn=getSelectionModel().getSelectedItem();
        Bus.INSTANCE.post(new MethodOpenEvent(owner,mn,info));
      }
    }
  }
);
  getItems().addListener((  ListChangeListener.Change<? extends MethodNode> c) -> {
    while (c.next()) {
      if (c.wasRemoved() || c.wasAdded()) {
        Bus.INSTANCE.post(new ClassDirtyEvent(owner));
      }
    }
  }
);
  TableColumn<MethodNode,Integer> colFlags=new TableColumn<>(Lang.get("String_Node_Str"));
  TableColumn<MethodNode,String> colName=new TableColumn<>(Lang.get("String_Node_Str"));
  TableColumn<MethodNode,Type> colRet=new TableColumn<>(Lang.get("String_Node_Str"));
  TableColumn<MethodNode,Type[]> colArgs=new TableColumn<>(Lang.get("String_Node_Str"));
  setFixedCellSize(20);
  getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
  getColumns().addAll(colFlags,colRet,colName,colArgs);
  colFlags.setCellValueFactory(cell -> JavaFX.observable(cell.getValue().access));
  colFlags.setCellFactory(cell -> new TableCell<MethodNode,Integer>(){
    @Override protected void updateItem(    Integer flags,    boolean empty){
      super.updateItem(flags,empty);
      if (empty || flags == null) {
        setGraphic(null);
      }
 else {
        setGraphic(Icons.getMember(true,flags));
      }
    }
  }
);
  colFlags.setComparator(Integer::compare);
  colName.setCellValueFactory(cell -> JavaFX.observable(cell.getValue().name));
  colName.setCellFactory(cell -> new TableCell<MethodNode,String>(){
    @Override protected void updateItem(    String name,    boolean empty){
      super.updateItem(name,empty);
      if (empty || name == null) {
        setGraphic(null);
      }
 else {
        setGraphic(FormatFactory.name(name));
      }
    }
  }
);
  colName.setComparator(Comparator.comparing(String::toString));
  colRet.setCellValueFactory(cell -> JavaFX.observable(Type.getType(cell.getValue().desc).getReturnType()));
  colRet.setCellFactory(cell -> new TableCell<MethodNode,Type>(){
    @Override protected void updateItem(    Type type,    boolean empty){
      super.updateItem(type,empty);
      if (empty || type == null) {
        setGraphic(null);
      }
 else {
        setGraphic(FormatFactory.type(type));
      }
    }
  }
);
  colRet.setComparator(Comparator.comparing(Type::toString));
  colRet.setComparator(new Comparator<Type>(){
    @Override public int compare(    Type o1,    Type o2){
      String s1=Misc.filter(o1);
      String s2=Misc.filter(o2);
      return Comparator.comparing(String::toString).compare(s1,s2);
    }
  }
);
  colArgs.setCellValueFactory(cell -> JavaFX.observable(Type.getType(cell.getValue().desc).getArgumentTypes()));
  colArgs.setCellFactory(cell -> new TableCell<MethodNode,Type[]>(){
    @Override protected void updateItem(    Type[] types,    boolean empty){
      super.updateItem(types,empty);
      if (empty || types == null || types.length == 0) {
        setGraphic(null);
      }
 else {
        setGraphic(FormatFactory.typeArray(types));
      }
    }
  }
);
  colArgs.setComparator(new Comparator<Type[]>(){
    @Override public int compare(    Type[] o1,    Type[] o2){
      int len=Math.min(o1.length,o2.length);
      for (int i=0; i < len; i++) {
        int c=Comparator.comparing(String::toString).compare(Misc.filter(o1[i]),Misc.filter(o2[i]));
        if (c != 0) {
          return c;
        }
      }
      if (o1.length == o2.length) {
        return 0;
      }
      return o1.length < o2.length ? -1 : 1;
    }
  }
);
  setItems(FXCollections.observableArrayList(methods));
  ContextMenu ctxBase=new ContextMenu();
  ContextMenu ctx=new ContextMenu();
  ctxBase.getItems().add(new ActionMenuItem(Lang.get("String_Node_Str"),() -> {
    MethodNode mn=new MethodNode(0,"String_Node_Str","String_Node_Str",null,null);
    methods.add(mn);
    getItems().add(mn);
  }
));
  setContextMenu(ctxBase);
  ctx.getItems().add(new ActionMenuItem(Lang.get("String_Node_Str"),() -> {
    methods.add(new MethodNode(0,"String_Node_Str","String_Node_Str",null,null));
    MethodNode mn=getSelectionModel().getSelectedItem();
    Bus.INSTANCE.post(new InsnOpenEvent(owner,mn,null));
  }
));
  ctx.getItems().add(new ActionMenuItem(Lang.get("String_Node_Str"),() -> {
    MethodNode mn=getSelectionModel().getSelectedItem();
    DecompileItem decomp=new DecompileItem(owner,mn);
    decomp.decompile();
  }
));
  ctx.getItems().add(new ActionMenuItem(Lang.get("String_Node_Str"),() -> {
    MethodNode mn=getSelectionModel().getSelectedItem();
    FxSearch.open(Parameter.references(owner.name,mn.name,mn.desc));
  }
));
  ctx.getItems().add(new ActionMenuItem(Lang.get("String_Node_Str"),() -> {
    MethodNode mn=new MethodNode(0,"String_Node_Str","String_Node_Str",null,null);
    methods.add(mn);
    getItems().add(mn);
  }
));
  ctx.getItems().add(new ActionMenuItem(Lang.get("String_Node_Str"),() -> {
    int i=getSelectionModel().getSelectedIndex();
    methods.remove(i);
    getItems().remove(i);
  }
));
  ctx.getItems().add(new ActionMenuItem(Lang.get("String_Node_Str"),() -> {
    MethodNode sel=getSelectionModel().getSelectedItem();
    String[] exceptions=sel.exceptions.toArray(new String[sel.exceptions.size()]);
    MethodNode copy=new MethodNode(sel.access,sel.name + "String_Node_Str",sel.desc,sel.signature,exceptions);
    sel.accept(copy);
    methods.add(copy);
    getItems().add(copy);
  }
));
  getSelectionModel().selectedIndexProperty().addListener((c) -> {
    setContextMenu(getSelectionModel().getSelectedIndex() == -1 ? null : ctx);
  }
);
  getItems().addListener((  ListChangeListener.Change<? extends MethodNode> c) -> {
    Bus.INSTANCE.post(new ClassDirtyEvent(owner));
  }
);
}

Fixed version (ground truth):
@SuppressWarnings("String_Node_Str") public MethodInfo(ClassNode owner,List<MethodNode> methods){
  MethodInfo info=this;
  setOnMouseClicked(new EventHandler<MouseEvent>(){
    @Override public void handle(    MouseEvent e){
      if ((e.getClickCount() == 2 && e.getButton() == MouseButton.PRIMARY) || (e.getButton() == MouseButton.MIDDLE)) {
        MethodNode mn=getSelectionModel().getSelectedItem();
        Bus.INSTANCE.post(new MethodOpenEvent(owner,mn,info));
      }
    }
  }
);
  getItems().addListener((  ListChangeListener.Change<? extends MethodNode> c) -> {
    while (c.next()) {
      if (c.wasRemoved() || c.wasAdded()) {
        Bus.INSTANCE.post(new ClassDirtyEvent(owner));
      }
    }
  }
);
  TableColumn<MethodNode,Integer> colFlags=new TableColumn<>(Lang.get("String_Node_Str"));
  TableColumn<MethodNode,String> colName=new TableColumn<>(Lang.get("String_Node_Str"));
  TableColumn<MethodNode,Type> colRet=new TableColumn<>(Lang.get("String_Node_Str"));
  TableColumn<MethodNode,Type[]> colArgs=new TableColumn<>(Lang.get("String_Node_Str"));
  setFixedCellSize(20);
  getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
  getColumns().addAll(colFlags,colRet,colName,colArgs);
  colFlags.setCellValueFactory(cell -> JavaFX.observable(cell.getValue().access));
  colFlags.setCellFactory(cell -> new TableCell<MethodNode,Integer>(){
    @Override protected void updateItem(    Integer flags,    boolean empty){
      super.updateItem(flags,empty);
      if (empty || flags == null) {
        setGraphic(null);
      }
 else {
        setGraphic(Icons.getMember(true,flags));
      }
    }
  }
);
  colFlags.setComparator(Integer::compare);
  colName.setCellValueFactory(cell -> JavaFX.observable(cell.getValue().name));
  colName.setCellFactory(cell -> new TableCell<MethodNode,String>(){
    @Override protected void updateItem(    String name,    boolean empty){
      super.updateItem(name,empty);
      if (empty || name == null) {
        setGraphic(null);
      }
 else {
        setGraphic(FormatFactory.name(name));
      }
    }
  }
);
  colName.setComparator(Comparator.comparing(String::toString));
  colRet.setCellValueFactory(cell -> JavaFX.observable(Type.getType(cell.getValue().desc).getReturnType()));
  colRet.setCellFactory(cell -> new TableCell<MethodNode,Type>(){
    @Override protected void updateItem(    Type type,    boolean empty){
      super.updateItem(type,empty);
      if (empty || type == null) {
        setGraphic(null);
      }
 else {
        setGraphic(FormatFactory.type(type));
      }
    }
  }
);
  colRet.setComparator(Comparator.comparing(Type::toString));
  colRet.setComparator(new Comparator<Type>(){
    @Override public int compare(    Type o1,    Type o2){
      String s1=Misc.filter(o1);
      String s2=Misc.filter(o2);
      return Comparator.comparing(String::toString).compare(s1,s2);
    }
  }
);
  colArgs.setCellValueFactory(cell -> JavaFX.observable(Type.getType(cell.getValue().desc).getArgumentTypes()));
  colArgs.setCellFactory(cell -> new TableCell<MethodNode,Type[]>(){
    @Override protected void updateItem(    Type[] types,    boolean empty){
      super.updateItem(types,empty);
      if (empty || types == null || types.length == 0) {
        setGraphic(null);
      }
 else {
        setGraphic(FormatFactory.typeArray(types));
      }
    }
  }
);
  colArgs.setComparator(new Comparator<Type[]>(){
    @Override public int compare(    Type[] o1,    Type[] o2){
      int len=Math.min(o1.length,o2.length);
      for (int i=0; i < len; i++) {
        int c=Comparator.comparing(String::toString).compare(Misc.filter(o1[i]),Misc.filter(o2[i]));
        if (c != 0) {
          return c;
        }
      }
      if (o1.length == o2.length) {
        return 0;
      }
      return o1.length < o2.length ? -1 : 1;
    }
  }
);
  setItems(FXCollections.observableArrayList(methods));
  ContextMenu ctxBase=new ContextMenu();
  ContextMenu ctx=new ContextMenu();
  ctxBase.getItems().add(new ActionMenuItem(Lang.get("String_Node_Str"),() -> {
    MethodNode mn=new MethodNode(0,"String_Node_Str","String_Node_Str",null,null);
    methods.add(mn);
    getItems().add(mn);
  }
));
  setContextMenu(ctxBase);
  ctx.getItems().add(new ActionMenuItem(Lang.get("String_Node_Str"),() -> {
    MethodNode mn=getSelectionModel().getSelectedItem();
    Bus.INSTANCE.post(new InsnOpenEvent(owner,mn,null));
  }
));
  ctx.getItems().add(new ActionMenuItem(Lang.get("String_Node_Str"),() -> {
    MethodNode mn=getSelectionModel().getSelectedItem();
    DecompileItem decomp=new DecompileItem(owner,mn);
    decomp.decompile();
  }
));
  ctx.getItems().add(new ActionMenuItem(Lang.get("String_Node_Str"),() -> {
    MethodNode mn=getSelectionModel().getSelectedItem();
    FxSearch.open(Parameter.references(owner.name,mn.name,mn.desc));
  }
));
  ctx.getItems().add(new ActionMenuItem(Lang.get("String_Node_Str"),() -> {
    MethodNode mn=new MethodNode(0,"String_Node_Str","String_Node_Str",null,null);
    methods.add(mn);
    getItems().add(mn);
  }
));
  ctx.getItems().add(new ActionMenuItem(Lang.get("String_Node_Str"),() -> {
    int i=getSelectionModel().getSelectedIndex();
    methods.remove(i);
    getItems().remove(i);
  }
));
  ctx.getItems().add(new ActionMenuItem(Lang.get("String_Node_Str"),() -> {
    MethodNode sel=getSelectionModel().getSelectedItem();
    String[] exceptions=sel.exceptions.toArray(new String[sel.exceptions.size()]);
    MethodNode copy=new MethodNode(sel.access,sel.name + "String_Node_Str",sel.desc,sel.signature,exceptions);
    sel.accept(copy);
    methods.add(copy);
    getItems().add(copy);
  }
));
  getSelectionModel().selectedIndexProperty().addListener((c) -> {
    setContextMenu(getSelectionModel().getSelectedIndex() == -1 ? null : ctx);
  }
);
  getItems().addListener((  ListChangeListener.Change<? extends MethodNode> c) -> {
    Bus.INSTANCE.post(new ClassDirtyEvent(owner));
  }
);
}