private void editHashBang(@Nullable("null means new") String oldHashBang) {
    FileTypeManagerImpl.FileTypeWithDescriptor ftd = myRecognizedFileType.getSelectedFileType();
    if (ftd == null) return;
    FileType type = ftd.fileType();

    if (oldHashBang == null) {
      FileTypeConfigurableInteractions.hashbangAdded.log(type);
    }
    else {
      FileTypeConfigurableInteractions.hashbangEdited.log(type);
    }

    String title = FileTypesBundle.message(oldHashBang == null ? "filetype.add.hashbang.title" : "filetype.edit.hashbang.title");

    String hashbang = Messages.showInputDialog(myHashBangs.myList, FileTypesBundle.message("filetype.edit.hashbang.prompt"), title, null, oldHashBang, null);
    if (StringUtil.isEmpty(hashbang)) {
      return; //canceled or empty
    }
    HashBangConflict conflict = checkHashBangConflict(hashbang);
    if (conflict != null && conflict.fileType.fileType() != type) {
      FileTypeManagerImpl.FileTypeWithDescriptor existingFtd = conflict.fileType;
      FileType existingFileType = existingFtd.fileType();
      if (!conflict.writeable) {
        String message = conflict.exact
                         ? FileTypesBundle.message("filetype.edit.hashbang.exists.exact.error", existingFileType.getDescription())
                         : FileTypesBundle.message("filetype.edit.hashbang.exists.similar.error", existingFileType.getDescription(), conflict.existingHashBang);
        Messages.showMessageDialog(myHashBangs.myList, message, title, Messages.getErrorIcon());
        return;
      }
      String message = conflict.exact ? FileTypesBundle.message("filetype.edit.hashbang.exists.exact.message", existingFileType.getDescription())
                                      : FileTypesBundle.message("filetype.edit.hashbang.exists.similar.message", existingFileType.getDescription(), conflict.existingHashBang);
      int ret = Messages.showOkCancelDialog(myHashBangs.myList, message,
                                            FileTypesBundle.message("filetype.edit.hashbang.exists.title"),
                                            FileTypesBundle.message("filetype.edit.hashbang.reassign.button"),
                                            CommonBundle.getCancelButtonText(), Messages.getQuestionIcon());
      if (ret != Messages.OK) {
        return;
      }
      myTempPatternsTable.removeHashBangPattern(hashbang, existingFtd);
      myTempPatternsTable.removeHashBangPattern(conflict.existingHashBang, conflict.fileType);
    }
    if (oldHashBang != null) {
      myTempPatternsTable.removeHashBangPattern(oldHashBang, ftd);
    }
    myTempPatternsTable.addHashBangPattern(hashbang, ftd);

    updateExtensionList();
    myHashBangs.select(hashbang);
    IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> IdeFocusManager.getGlobalInstance().requestFocus(myPatterns.myList, true));
  }
private void editHashBang(@Nullable("null means new") String oldHashBang)