public static List<ParameterInfoImpl> performChange(
      final Project project,
      final Editor editor,
      final PsiFile file,
      final PsiMethod method,
      final int minUsagesNumber,
      final ParameterInfoImpl[] newParametersInfo,
      final boolean changeAllUsages,
      final boolean allowDelegation) {
    if (!FileModificationService.getInstance().prepareFileForWrite(method.getContainingFile()))
      return null;
    final FindUsagesManager findUsagesManager =
        ((FindManagerImpl) FindManager.getInstance(project)).getFindUsagesManager();
    final FindUsagesHandler handler = findUsagesManager.getFindUsagesHandler(method, false);
    if (handler == null) return null; // on failure or cancel (e.g. cancel of super methods dialog)

    final JavaMethodFindUsagesOptions options = new JavaMethodFindUsagesOptions(project);
    options.isImplementingMethods = true;
    options.isOverridingMethods = true;
    options.isUsages = true;
    options.isSearchForTextOccurrences = false;
    final int[] usagesFound = new int[1];
    Runnable runnable =
        () -> {
          Processor<UsageInfo> processor = t -> ++usagesFound[0] < minUsagesNumber;

          handler.processElementUsages(method, processor, options);
        };
    String progressTitle = QuickFixBundle.message("searching.for.usages.progress.title");
    if (!ProgressManager.getInstance()
        .runProcessWithProgressSynchronously(runnable, progressTitle, true, project)) return null;

    if (ApplicationManager.getApplication().isUnitTestMode() || usagesFound[0] < minUsagesNumber) {
      ChangeSignatureProcessor processor =
          new ChangeSignatureProcessor(
              project,
              method,
              false,
              null,
              method.getName(),
              method.getReturnType(),
              newParametersInfo) {
            @Override
            @NotNull
            protected UsageInfo[] findUsages() {
              return changeAllUsages ? super.findUsages() : UsageInfo.EMPTY_ARRAY;
            }

            @Override
            protected void performRefactoring(@NotNull UsageInfo[] usages) {
              CommandProcessor.getInstance().setCurrentCommandName(getCommandName());
              super.performRefactoring(usages);
            }
          };
      processor.run();
      ApplicationManager.getApplication().runWriteAction(() -> UndoUtil.markPsiFileForUndo(file));
      return Arrays.asList(newParametersInfo);
    } else {
      final List<ParameterInfoImpl> parameterInfos =
          newParametersInfo != null
              ? new ArrayList<ParameterInfoImpl>(Arrays.asList(newParametersInfo))
              : new ArrayList<ParameterInfoImpl>();
      final PsiReferenceExpression refExpr =
          JavaTargetElementEvaluator.findReferenceExpression(editor);
      JavaChangeSignatureDialog dialog =
          JavaChangeSignatureDialog.createAndPreselectNew(
              project, method, parameterInfos, allowDelegation, refExpr);
      dialog.setParameterInfos(parameterInfos);
      dialog.show();
      return dialog.isOK() ? dialog.getParameters() : null;
    }
  }