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(); } }