Пример #1
0
  protected void setOptions(boolean validateOnly, IProgressMonitor pm) {
    // add a new pending request ID
    final int id;
    synchronized (pendingRequestIds) {
      id = ++lastId;
      pendingRequestIds.add(id);
    }
    // do request
    serverErrorStatus = null;
    final CountDownLatch latch = new CountDownLatch(1);
    RefactoringOptions options = getOptions();
    DartCore.getAnalysisServer()
        .edit_getRefactoring(
            kind,
            file,
            offset,
            length,
            validateOnly,
            options,
            new GetRefactoringConsumer() {
              @Override
              public void computedRefactorings(
                  List<RefactoringProblem> initialProblems,
                  List<RefactoringProblem> optionsProblems,
                  List<RefactoringProblem> finalProblems,
                  RefactoringFeedback feedback,
                  SourceChange _change,
                  List<String> potentialEdits) {
                if (feedback != null) {
                  setFeedback(feedback);
                }
                externalFiles.clear();
                initialStatus = toRefactoringStatus(initialProblems);
                optionsStatus = toRefactoringStatus(optionsProblems);
                finalStatus = toRefactoringStatus(finalProblems);
                change = toLTK(_change, externalFiles);
                latch.countDown();
                requestDone(id);
              }

              @Override
              public void onError(RequestError requestError) {
                String message = "Server error: " + requestError.getMessage();
                serverErrorStatus = RefactoringStatus.createFatalErrorStatus(message);
                latch.countDown();
                requestDone(id);
              }

              private void requestDone(final int id) {
                synchronized (pendingRequestIds) {
                  pendingRequestIds.remove(id);
                  notifyListener();
                }
              }
            });
    // wait for completion
    if (pm != null) {
      while (true) {
        if (pm.isCanceled()) {
          throw new OperationCanceledException();
        }
        boolean done = Uninterruptibles.awaitUninterruptibly(latch, 10, TimeUnit.MILLISECONDS);
        if (done) {
          return;
        }
      }
    } else {
      // Wait a very short time, just in case it it can be done fast,
      // so that we don't have to disable UI and re-enable it 2 milliseconds later.
      Uninterruptibles.awaitUninterruptibly(latch, 10, TimeUnit.MILLISECONDS);
      notifyListener();
    }
  }