From 277ee177090843c0b2560e779d3bff3af9dd9ce5 Mon Sep 17 00:00:00 2001
From: Fred Bricon <fbricon@gmail.com>
Date: Fri, 9 Jun 2017 10:40:09 -0400
Subject: [PATCH] Handle CompletableFutures more consistently across the board

Fixes #243
Fixes #240

Signed-off-by: Fred Bricon <fbricon@gmail.com>
---
 .../handlers/ClassfileContentHandler.java     | 48 +++++++++----------
 .../internal/handlers/CodeLensHandler.java    | 26 ++++++----
 .../internal/handlers/CompletionHandler.java  | 36 +++++++-------
 .../handlers/CompletionResolveHandler.java    |  5 +-
 .../handlers/DocumentHighlightHandler.java    | 20 ++++----
 .../handlers/DocumentSymbolHandler.java       | 35 +++++++-------
 .../internal/handlers/FormatterHandler.java   | 37 ++++++--------
 .../core/internal/handlers/HoverHandler.java  | 28 +++++------
 .../core/internal/handlers/InitHandler.java   |  6 +--
 .../internal/handlers/JDTLanguageServer.java  | 36 +++++++++-----
 .../handlers/NavigateToDefinitionHandler.java | 12 ++---
 .../internal/handlers/ReferencesHandler.java  |  6 +--
 .../handlers/WorkspaceSymbolHandler.java      |  6 +--
 .../handlers/ClassfileContentHandlerTest.java |  2 +-
 .../handlers/CodeLensHandlerTest.java         | 16 +++----
 .../handlers/DocumentSymbolHandlerTest.java   |  4 +-
 .../internal/handlers/HoverHandlerTest.java   | 10 ++--
 .../NavigateToDefinitionHandlerTest.java      |  6 +--
 .../handlers/WorkspaceSymbolHandlerTest.java  | 14 +++---
 19 files changed, 176 insertions(+), 177 deletions(-)

diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/ClassfileContentHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/ClassfileContentHandler.java
index f001c4bff8..851be55059 100644
--- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/ClassfileContentHandler.java
+++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/ClassfileContentHandler.java
@@ -10,42 +10,42 @@
  *******************************************************************************/
 package org.eclipse.jdt.ls.core.internal.handlers;
 
-import java.util.concurrent.CompletableFuture;
-
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.IBuffer;
 import org.eclipse.jdt.core.IClassFile;
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.ls.core.internal.JDTUtils;
 import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin;
 import org.eclipse.lsp4j.TextDocumentIdentifier;
-import org.eclipse.lsp4j.jsonrpc.CompletableFutures;
 
 public class ClassfileContentHandler {
 
-	public CompletableFuture<String> contents(TextDocumentIdentifier param) {
-		return CompletableFutures.computeAsync(cm->{
-			String source = null;
-			try {
-				IClassFile cf  = JDTUtils.resolveClassFile(param.getUri());
-				if (cf != null) {
-					IBuffer buffer = cf.getBuffer();
-					if (buffer != null){
-						cm.checkCanceled();
-						JavaLanguageServerPlugin.logInfo("ClassFile contents request completed");
-						source = buffer.getContents();
-					}
-					if (source == null) {
-						source = JDTUtils.disassemble(cf);
+	private static final String EMPTY_CONTENT = "";
+
+	public String contents(TextDocumentIdentifier param, IProgressMonitor monitor) {
+		String source = null;
+		try {
+			IClassFile cf = JDTUtils.resolveClassFile(param.getUri());
+			if (cf != null) {
+				IBuffer buffer = cf.getBuffer();
+				if (buffer != null) {
+					if (monitor.isCanceled()) {
+						return EMPTY_CONTENT;
 					}
+					source = buffer.getContents();
+					JavaLanguageServerPlugin.logInfo("ClassFile contents request completed");
+				}
+				if (source == null) {
+					source = JDTUtils.disassemble(cf);
 				}
-			} catch (JavaModelException e) {
-				JavaLanguageServerPlugin.logException("Exception getting java element ", e);
-			}
-			if (source == null) {
-				source = "";//need to return non null value
 			}
-			return source;
-		});
+		} catch (JavaModelException e) {
+			JavaLanguageServerPlugin.logException("Exception getting java element ", e);
+		}
+		if (source == null) {
+			source = EMPTY_CONTENT;// need to return non null value
+		}
+		return source;
 	}
 
 }
\ No newline at end of file
diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CodeLensHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CodeLensHandler.java
index 8436e1cede..d10a7d1da4 100644
--- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CodeLensHandler.java
+++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CodeLensHandler.java
@@ -18,7 +18,7 @@
 
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IJavaProject;
@@ -51,7 +51,7 @@ public CodeLensHandler(PreferenceManager preferenceManager) {
 	}
 
 	@SuppressWarnings("unchecked")
-	public CodeLens resolve(CodeLens lens){
+	public CodeLens resolve(CodeLens lens, IProgressMonitor monitor) {
 		if (lens == null) {
 			return null;
 		}
@@ -67,7 +67,7 @@ public CodeLens resolve(CodeLens lens){
 			}
 			Map<String, Object> position = (Map<String, Object>) data.get(1);
 			IJavaElement element = JDTUtils.findElementAtSelection(unit,  ((Double)position.get("line")).intValue(), ((Double)position.get("character")).intValue());
-			List<Location> locations = findReferences(element);
+			List<Location> locations = findReferences(element, monitor);
 			int nReferences = locations.size();
 			Command command = new Command(nReferences == 1 ? "1 reference" : nReferences + " references",
 					"java.show.references",
@@ -79,7 +79,8 @@ public CodeLens resolve(CodeLens lens){
 		return lens;
 	}
 
-	private List<Location> findReferences(IJavaElement element) throws JavaModelException, CoreException {
+	private List<Location> findReferences(IJavaElement element, IProgressMonitor monitor)
+			throws JavaModelException, CoreException {
 		if (element == null) {
 			return Collections.emptyList();
 		}
@@ -106,12 +107,12 @@ public void acceptSearchMatch(SearchMatch match) throws CoreException {
 				}
 
 			}
-		}, new NullProgressMonitor());
+		}, monitor);
 
 		return result;
 	}
 
-	public List<CodeLens> getCodeLensSymbols(String uri) {
+	public List<CodeLens> getCodeLensSymbols(String uri, IProgressMonitor monitor) {
 		if (!preferenceManager.getPreferences().isReferencesCodeLensEnabled()) {
 			return Collections.emptyList();
 		}
@@ -122,7 +123,10 @@ public List<CodeLens> getCodeLensSymbols(String uri) {
 		try {
 			IJavaElement[] elements = unit.getChildren();
 			ArrayList<CodeLens> lenses = new ArrayList<>(elements.length);
-			collectChildren(unit, elements, lenses);
+			collectChildren(unit, elements, lenses, monitor);
+			if (monitor.isCanceled()) {
+				lenses.clear();
+			}
 			return lenses;
 		} catch (JavaModelException e) {
 			JavaLanguageServerPlugin.logException("Problem getting code lenses for" + unit.getElementName(), e);
@@ -130,11 +134,15 @@ public List<CodeLens> getCodeLensSymbols(String uri) {
 		return Collections.emptyList();
 	}
 
-	private void collectChildren(ICompilationUnit unit, IJavaElement[] elements, ArrayList<CodeLens> lenses)
+	private void collectChildren(ICompilationUnit unit, IJavaElement[] elements, ArrayList<CodeLens> lenses,
+			IProgressMonitor monitor)
 			throws JavaModelException {
 		for (IJavaElement element : elements) {
+			if (monitor.isCanceled()) {
+				return;
+			}
 			if (element.getElementType() == IJavaElement.TYPE) {
-				collectChildren(unit, ((IType) element).getChildren(), lenses);
+				collectChildren(unit, ((IType) element).getChildren(), lenses, monitor);
 			} else if (element.getElementType() != IJavaElement.METHOD || JDTUtils.isHiddenGeneratedElement(element)) {
 				continue;
 			}
diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionHandler.java
index 47098dc0bf..7518ecbf7e 100644
--- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionHandler.java
+++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionHandler.java
@@ -13,41 +13,37 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.CompletionProposal;
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.ls.core.internal.CancellableProgressMonitor;
 import org.eclipse.jdt.ls.core.internal.JDTUtils;
 import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin;
 import org.eclipse.jdt.ls.core.internal.contentassist.CompletionProposalRequestor;
 import org.eclipse.lsp4j.CompletionItem;
 import org.eclipse.lsp4j.CompletionList;
 import org.eclipse.lsp4j.TextDocumentPositionParams;
-import org.eclipse.lsp4j.jsonrpc.CompletableFutures;
 import org.eclipse.lsp4j.jsonrpc.messages.Either;
 
 public class CompletionHandler{
 
-	CompletableFuture<Either<List<CompletionItem>, CompletionList>> completion(TextDocumentPositionParams position){
-		return CompletableFutures.computeAsync(cancelChecker->{
-			List<CompletionItem> completionItems;
-			try {
-				ICompilationUnit unit = JDTUtils.resolveCompilationUnit(position.getTextDocument().getUri());
-				completionItems = this.computeContentAssist(unit,
-						position.getPosition().getLine(),
-						position.getPosition().getCharacter(), new CancellableProgressMonitor(cancelChecker));
-			} catch (Exception e) {
-				JavaLanguageServerPlugin.logException("Problem with codeComplete for " +  position.getTextDocument().getUri(), e);
-				completionItems = Collections.emptyList();
-			}
-			CompletionList $ = new CompletionList();
-			$.setItems(completionItems);
-			JavaLanguageServerPlugin.logInfo("Completion request completed");
-			return Either.forRight($);
-		});
+	Either<List<CompletionItem>, CompletionList> completion(TextDocumentPositionParams position,
+			IProgressMonitor monitor) {
+		List<CompletionItem> completionItems;
+		try {
+			ICompilationUnit unit = JDTUtils.resolveCompilationUnit(position.getTextDocument().getUri());
+			completionItems = this.computeContentAssist(unit,
+					position.getPosition().getLine(),
+					position.getPosition().getCharacter(), monitor);
+		} catch (Exception e) {
+			JavaLanguageServerPlugin.logException("Problem with codeComplete for " +  position.getTextDocument().getUri(), e);
+			completionItems = Collections.emptyList();
+		}
+		CompletionList $ = new CompletionList();
+		$.setItems(completionItems);
+		JavaLanguageServerPlugin.logInfo("Completion request completed");
+		return Either.forRight($);
 	}
 
 	private List<CompletionItem> computeContentAssist(ICompilationUnit unit, int line, int column, IProgressMonitor monitor) throws JavaModelException {
diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionResolveHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionResolveHandler.java
index a7f998d2e5..4573b3f1b1 100644
--- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionResolveHandler.java
+++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionResolveHandler.java
@@ -18,6 +18,7 @@
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.IField;
 import org.eclipse.jdt.core.IMember;
@@ -61,7 +62,7 @@ public CompletionResolveHandler(PreferenceManager manager) {
 	public static final String DATA_FIELD_REQUEST_ID = "rid";
 	public static final String DATA_FIELD_PROPOSAL_ID = "pid";
 
-	public CompletionItem resolve(CompletionItem param) {
+	public CompletionItem resolve(CompletionItem param, IProgressMonitor monitor) {
 
 		@SuppressWarnings("unchecked")
 		Map<String, String> data = (Map<String, String>) param.getData();
@@ -117,7 +118,7 @@ public CompletionItem resolve(CompletionItem param) {
 					member = type;
 				}
 
-				if (member!=null && member.exists()) {
+				if (member != null && member.exists() && !monitor.isCanceled()) {
 					String javadoc = null;
 					try {
 						final IMember curMember = member;
diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentHighlightHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentHighlightHandler.java
index ecf04a621a..48357eb680 100644
--- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentHighlightHandler.java
+++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentHighlightHandler.java
@@ -13,9 +13,8 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 
-import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.ITypeRoot;
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.dom.CompilationUnit;
@@ -34,12 +33,12 @@
 @SuppressWarnings("restriction")
 public class DocumentHighlightHandler{
 
-	private List<DocumentHighlight> computeOccurrences(ITypeRoot unit, int line, int column) {
+	private List<DocumentHighlight> computeOccurrences(ITypeRoot unit, int line, int column, IProgressMonitor monitor) {
 		if (unit != null) {
 			try {
 				int offset = JsonRpcHelpers.toOffset(unit.getBuffer(), line, column);
 				OccurrencesFinder finder = new OccurrencesFinder();
-				CompilationUnit ast = SharedASTProvider.getInstance().getAST(unit, new NullProgressMonitor());
+				CompilationUnit ast = SharedASTProvider.getInstance().getAST(unit, monitor);
 				if (ast != null) {
 					String error = finder.initialize(ast, offset, 0);
 					if (error == null){
@@ -47,6 +46,9 @@ private List<DocumentHighlight> computeOccurrences(ITypeRoot unit, int line, int
 						OccurrenceLocation[] occurrences = finder.getOccurrences();
 						if (occurrences != null) {
 							for (OccurrenceLocation loc : occurrences) {
+								if (monitor.isCanceled()) {
+									return Collections.emptyList();
+								}
 								result.add(convertToHighlight(unit, loc));
 							}
 						}
@@ -79,12 +81,10 @@ private DocumentHighlight convertToHighlight(ITypeRoot unit, OccurrenceLocation
 		return h;
 	}
 
-	CompletableFuture<List<? extends DocumentHighlight>> documentHighlight(TextDocumentPositionParams position){
-		return CompletableFuture.supplyAsync(()->{
-			ITypeRoot type = JDTUtils.resolveTypeRoot(position.getTextDocument().getUri());
-			return computeOccurrences(type, position.getPosition().getLine(),
-					position.getPosition().getCharacter());
-		});
+	List<? extends DocumentHighlight> documentHighlight(TextDocumentPositionParams position, IProgressMonitor monitor) {
+		ITypeRoot type = JDTUtils.resolveTypeRoot(position.getTextDocument().getUri());
+		return computeOccurrences(type, position.getPosition().getLine(),
+				position.getPosition().getCharacter(), monitor);
 	}
 
 }
diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentSymbolHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentSymbolHandler.java
index 0006259c0b..ff76cbcc3a 100644
--- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentSymbolHandler.java
+++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentSymbolHandler.java
@@ -14,9 +14,9 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 import java.util.stream.Stream;
 
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.Flags;
 import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IMember;
@@ -34,11 +34,21 @@
 
 public class DocumentSymbolHandler {
 
-	private SymbolInformation[] getOutline(ITypeRoot unit) {
+	public List<? extends SymbolInformation> documentSymbol(DocumentSymbolParams params,
+			IProgressMonitor monitor) {
+		ITypeRoot unit = JDTUtils.resolveTypeRoot(params.getTextDocument().getUri());
+		if (unit == null) {
+			return Collections.emptyList();
+		}
+		SymbolInformation[] elements = this.getOutline(unit, monitor);
+		return Arrays.asList(elements);
+	}
+
+	private SymbolInformation[] getOutline(ITypeRoot unit, IProgressMonitor monitor) {
 		try {
 			IJavaElement[] elements = unit.getChildren();
 			ArrayList<SymbolInformation> symbols = new ArrayList<>(elements.length);
-			collectChildren(unit, elements, symbols);
+			collectChildren(unit, elements, symbols, monitor);
 			return symbols.toArray(new SymbolInformation[symbols.size()]);
 		} catch (JavaModelException e) {
 			JavaLanguageServerPlugin.logException("Problem getting outline for" +  unit.getElementName(), e);
@@ -46,11 +56,15 @@ private SymbolInformation[] getOutline(ITypeRoot unit) {
 		return new SymbolInformation[0];
 	}
 
-	private void collectChildren(ITypeRoot unit, IJavaElement[] elements, ArrayList<SymbolInformation> symbols)
+	private void collectChildren(ITypeRoot unit, IJavaElement[] elements, ArrayList<SymbolInformation> symbols,
+			IProgressMonitor monitor)
 			throws JavaModelException {
 		for(IJavaElement element : elements ){
+			if (monitor.isCanceled()) {
+				return;
+			}
 			if(element instanceof IParent){
-				collectChildren(unit, filter(((IParent)element).getChildren()), symbols);
+				collectChildren(unit, filter(((IParent) element).getChildren()), symbols, monitor);
 			}
 			if(element.getElementType() != IJavaElement.FIELD &&
 					element.getElementType() != IJavaElement.METHOD
@@ -106,17 +120,6 @@ private boolean isSyntheticElement(IJavaElement element) {
 		}
 	}
 
-	public CompletableFuture<List<? extends SymbolInformation>> documentSymbol(DocumentSymbolParams params){
-		return CompletableFuture.supplyAsync(()->{
-			ITypeRoot unit = JDTUtils.resolveTypeRoot(params.getTextDocument().getUri());
-			if(unit == null ) {
-				return Collections.emptyList();
-			}
-			SymbolInformation[] elements  = this.getOutline(unit);
-			return Arrays.asList(elements);
-		});
-	}
-
 	public static SymbolKind mapKind(IJavaElement element) {
 		switch (element.getElementType()) {
 		case IJavaElement.ANNOTATION:
diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/FormatterHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/FormatterHandler.java
index 5a37b817c7..3ba036b853 100644
--- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/FormatterHandler.java
+++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/FormatterHandler.java
@@ -14,9 +14,9 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.JavaModelException;
@@ -45,28 +45,21 @@
  */
 public class FormatterHandler {
 
-	CompletableFuture<List<? extends org.eclipse.lsp4j.TextEdit>> formatting(DocumentFormattingParams params){
-		return CompletableFuture.supplyAsync( ()->{
-			ICompilationUnit cu = JDTUtils.resolveCompilationUnit(params.getTextDocument().getUri());
-			if(cu == null ) {
-				return Collections.emptyList();
-			}
-			return format(cu,params.getOptions(), null);
-		});
-
+	List<? extends org.eclipse.lsp4j.TextEdit> formatting(DocumentFormattingParams params, IProgressMonitor monitor) {
+		return format(params.getTextDocument().getUri(), params.getOptions(), null, monitor);
 	}
 
-	CompletableFuture<List<? extends org.eclipse.lsp4j.TextEdit>> rangeFormatting(DocumentRangeFormattingParams params){
-		return CompletableFuture.supplyAsync(()->{
-			ICompilationUnit cu = JDTUtils.resolveCompilationUnit(params.getTextDocument().getUri());
-			if(cu == null ) {
-				return Collections.emptyList();
-			}
-			return format(cu, params.getOptions(), params.getRange());
-		});
+	List<? extends org.eclipse.lsp4j.TextEdit> rangeFormatting(DocumentRangeFormattingParams params,
+			IProgressMonitor monitor) {
+		return format(params.getTextDocument().getUri(), params.getOptions(), params.getRange(), monitor);
 	}
 
-	private List<org.eclipse.lsp4j.TextEdit> format(ICompilationUnit cu, FormattingOptions options, Range range) {
+	private List<org.eclipse.lsp4j.TextEdit> format(String uri, FormattingOptions options, Range range,
+			IProgressMonitor monitor) {
+		ICompilationUnit cu = JDTUtils.resolveCompilationUnit(uri);
+		if(cu == null ) {
+			return Collections.emptyList();
+		}
 
 		CodeFormatter formatter = ToolFactory.createCodeFormatter(getOptions(options,cu));
 
@@ -75,12 +68,12 @@ private List<org.eclipse.lsp4j.TextEdit> format(ICompilationUnit cu, FormattingO
 			String lineDelimiter = TextUtilities.getDefaultLineDelimiter(document);
 			IRegion region = (range == null ? new Region(0,document.getLength()) : getRegion(range,document));
 			// could not calculate region abort.
-			if(region == null ) {
-				return null;
+			if (region == null || monitor.isCanceled()) {
+				return Collections.<org.eclipse.lsp4j.TextEdit>emptyList();
 			}
 			String sourceToFormat = document.get();
 			TextEdit format = formatter.format(CodeFormatter.K_COMPILATION_UNIT, sourceToFormat, region.getOffset(), region.getLength(), 0, lineDelimiter);
-			if (format == null || format.getChildren().length == 0) {
+			if (format == null || format.getChildren().length == 0 || monitor.isCanceled()) {
 				// nothing to return
 				return Collections.<org.eclipse.lsp4j.TextEdit>emptyList();
 			}
diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/HoverHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/HoverHandler.java
index f71a31f614..ab7816b576 100644
--- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/HoverHandler.java
+++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/HoverHandler.java
@@ -13,32 +13,28 @@
 import static org.apache.commons.lang3.StringUtils.defaultString;
 
 import java.util.Arrays;
-import java.util.concurrent.CompletableFuture;
 
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.ITypeRoot;
 import org.eclipse.jdt.ls.core.internal.HoverInfoProvider;
 import org.eclipse.jdt.ls.core.internal.JDTUtils;
 import org.eclipse.lsp4j.Hover;
 import org.eclipse.lsp4j.TextDocumentPositionParams;
-import org.eclipse.lsp4j.jsonrpc.CompletableFutures;
 import org.eclipse.lsp4j.jsonrpc.messages.Either;
 
 public class HoverHandler{
 
-	public CompletableFuture<Hover> hover(TextDocumentPositionParams position){
-		return CompletableFutures.computeAsync(cancelToken->{
-			ITypeRoot unit = JDTUtils.resolveTypeRoot(position.getTextDocument().getUri());
-
-			String hover = null;
-			if(unit !=null){
-				cancelToken.checkCanceled();
-				hover = computeHover(unit ,position.getPosition().getLine(),
-						position.getPosition().getCharacter());
-			}
-			Hover $ = new Hover();
-			$.setContents(Arrays.asList(Either.forLeft(defaultString(hover))));
-			return $;
-		});
+	public Hover hover(TextDocumentPositionParams position, IProgressMonitor monitor) {
+		ITypeRoot unit = JDTUtils.resolveTypeRoot(position.getTextDocument().getUri());
+
+		String hover = null;
+		if (unit != null && !monitor.isCanceled()) {
+			hover = computeHover(unit ,position.getPosition().getLine(),
+					position.getPosition().getCharacter());
+		}
+		Hover $ = new Hover();
+		$.setContents(Arrays.asList(Either.forLeft(defaultString(hover))));
+		return $;
 	}
 
 	private String computeHover(ITypeRoot unit, int line, int column) {
diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/InitHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/InitHandler.java
index 2079bae73d..6279cc1b09 100644
--- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/InitHandler.java
+++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/InitHandler.java
@@ -66,9 +66,9 @@ InitializeResult initialize(InitializeParams param){
 		}else{
 			preferenceManager.updateClientPrefences(param.getCapabilities());
 		}
-		String rootPath = param.getRootPath();
-		if (param.getRootUri() != null) {
-			URI uri = URI.create(param.getRootUri());
+		String rootPath = param.getRootUri();
+		if (rootPath != null) {
+			URI uri = URI.create(rootPath);
 			if ("file".equals(uri.getScheme())){
 				rootPath = Paths.get(uri).toString();
 			}
diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/JDTLanguageServer.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/JDTLanguageServer.java
index 514ea227f3..c74f04c3f7 100644
--- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/JDTLanguageServer.java
+++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/JDTLanguageServer.java
@@ -11,6 +11,7 @@
 package org.eclipse.jdt.ls.core.internal.handlers;
 
 import static org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin.logInfo;
+import static org.eclipse.lsp4j.jsonrpc.CompletableFutures.computeAsync;
 
 import java.util.List;
 import java.util.Map;
@@ -18,7 +19,9 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.WorkingCopyOwner;
+import org.eclipse.jdt.ls.core.internal.CancellableProgressMonitor;
 import org.eclipse.jdt.ls.core.internal.JavaClientConnection;
 import org.eclipse.jdt.ls.core.internal.JavaClientConnection.JavaLanguageClient;
 import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin;
@@ -58,6 +61,7 @@
 import org.eclipse.lsp4j.TextEdit;
 import org.eclipse.lsp4j.WorkspaceEdit;
 import org.eclipse.lsp4j.WorkspaceSymbolParams;
+import org.eclipse.lsp4j.jsonrpc.CancelChecker;
 import org.eclipse.lsp4j.jsonrpc.messages.Either;
 import org.eclipse.lsp4j.jsonrpc.services.JsonDelegate;
 import org.eclipse.lsp4j.services.LanguageServer;
@@ -154,7 +158,9 @@ public JavaProtocolExtensions getJavaExtensions(){
 	public CompletableFuture<List<? extends SymbolInformation>> symbol(WorkspaceSymbolParams params) {
 		logInfo(">> workspace/symbol");
 		WorkspaceSymbolHandler handler = new WorkspaceSymbolHandler();
-		return CompletableFuture.supplyAsync(()->{return handler.search(params.getQuery());});
+		return computeAsync((cc) -> {
+			return handler.search(params.getQuery(), toMonitor(cc));
+		});
 	}
 
 	/* (non-Javadoc)
@@ -190,7 +196,7 @@ public void didChangeWatchedFiles(DidChangeWatchedFilesParams params) {
 	public CompletableFuture<Either<List<CompletionItem>, CompletionList>> completion(TextDocumentPositionParams position) {
 		logInfo(">> document/completion");
 		CompletionHandler handler = new CompletionHandler();
-		return handler.completion(position);
+		return computeAsync((cc) -> handler.completion(position, toMonitor(cc)));
 	}
 
 	/* (non-Javadoc)
@@ -200,7 +206,7 @@ public CompletableFuture<Either<List<CompletionItem>, CompletionList>> completio
 	public CompletableFuture<CompletionItem> resolveCompletionItem(CompletionItem unresolved) {
 		logInfo(">> document/resolveCompletionItem");
 		CompletionResolveHandler handler = new CompletionResolveHandler(preferenceManager);
-		return CompletableFuture.supplyAsync(()->handler.resolve(unresolved));
+		return computeAsync((cc) -> handler.resolve(unresolved, toMonitor(cc)));
 	}
 
 	/* (non-Javadoc)
@@ -210,7 +216,7 @@ public CompletableFuture<CompletionItem> resolveCompletionItem(CompletionItem un
 	public CompletableFuture<Hover> hover(TextDocumentPositionParams position) {
 		logInfo(">> document/hover");
 		HoverHandler handler = new HoverHandler();
-		return handler.hover(position);
+		return computeAsync((cc) -> handler.hover(position, toMonitor(cc)));
 	}
 
 	/* (non-Javadoc)
@@ -230,7 +236,7 @@ public CompletableFuture<SignatureHelp> signatureHelp(TextDocumentPositionParams
 	public CompletableFuture<List<? extends Location>> definition(TextDocumentPositionParams position) {
 		logInfo(">> document/definition");
 		NavigateToDefinitionHandler handler = new NavigateToDefinitionHandler();
-		return handler.definition(position);
+		return computeAsync((cc) -> handler.definition(position, toMonitor(cc)));
 	}
 
 	/* (non-Javadoc)
@@ -240,7 +246,7 @@ public CompletableFuture<List<? extends Location>> definition(TextDocumentPositi
 	public CompletableFuture<List<? extends Location>> references(ReferenceParams params) {
 		logInfo(">> document/references");
 		ReferencesHandler handler = new ReferencesHandler();
-		return CompletableFuture.supplyAsync(()->handler.findReferences(params));
+		return computeAsync((cc) -> handler.findReferences(params, toMonitor(cc)));
 	}
 
 	/* (non-Javadoc)
@@ -250,7 +256,7 @@ public CompletableFuture<List<? extends Location>> references(ReferenceParams pa
 	public CompletableFuture<List<? extends DocumentHighlight>> documentHighlight(TextDocumentPositionParams position) {
 		logInfo(">> document/documentHighlight");
 		DocumentHighlightHandler handler = new DocumentHighlightHandler();
-		return handler.documentHighlight(position);
+		return computeAsync((cc) -> handler.documentHighlight(position, toMonitor(cc)));
 	}
 
 	/* (non-Javadoc)
@@ -260,7 +266,7 @@ public CompletableFuture<List<? extends DocumentHighlight>> documentHighlight(Te
 	public CompletableFuture<List<? extends SymbolInformation>> documentSymbol(DocumentSymbolParams params) {
 		logInfo(">> document/documentSymbol");
 		DocumentSymbolHandler handler = new DocumentSymbolHandler();
-		return handler.documentSymbol(params);
+		return computeAsync((cc) -> handler.documentSymbol(params, toMonitor(cc)));
 	}
 
 	/* (non-Javadoc)
@@ -280,7 +286,7 @@ public CompletableFuture<List<? extends Command>> codeAction(CodeActionParams pa
 	public CompletableFuture<List<? extends CodeLens>> codeLens(CodeLensParams params) {
 		logInfo(">> document/codeLens");
 		CodeLensHandler handler = new CodeLensHandler(preferenceManager);
-		return CompletableFuture.supplyAsync(()->handler.getCodeLensSymbols(params.getTextDocument().getUri()));
+		return computeAsync((cc) -> handler.getCodeLensSymbols(params.getTextDocument().getUri(), toMonitor(cc)));
 	}
 
 	/* (non-Javadoc)
@@ -290,7 +296,7 @@ public CompletableFuture<List<? extends CodeLens>> codeLens(CodeLensParams param
 	public CompletableFuture<CodeLens> resolveCodeLens(CodeLens unresolved) {
 		logInfo(">> codeLens/resolve");
 		CodeLensHandler handler = new CodeLensHandler(preferenceManager);
-		return CompletableFuture.supplyAsync(()->handler.resolve(unresolved));
+		return computeAsync((cc) -> handler.resolve(unresolved, toMonitor(cc)));
 	}
 
 	/* (non-Javadoc)
@@ -300,7 +306,7 @@ public CompletableFuture<CodeLens> resolveCodeLens(CodeLens unresolved) {
 	public CompletableFuture<List<? extends TextEdit>> formatting(DocumentFormattingParams params) {
 		logInfo(">> document/formatting");
 		FormatterHandler handler = new FormatterHandler();
-		return handler.formatting(params);
+		return computeAsync((cc) -> handler.formatting(params, toMonitor(cc)));
 	}
 
 	/* (non-Javadoc)
@@ -310,7 +316,7 @@ public CompletableFuture<List<? extends TextEdit>> formatting(DocumentFormatting
 	public CompletableFuture<List<? extends TextEdit>> rangeFormatting(DocumentRangeFormattingParams params) {
 		logInfo(">> document/rangeFormatting");
 		FormatterHandler handler = new FormatterHandler();
-		return handler.rangeFormatting(params);
+		return computeAsync((cc) -> handler.rangeFormatting(params, toMonitor(cc)));
 	}
 
 	/* (non-Javadoc)
@@ -380,7 +386,7 @@ public void didSave(DidSaveTextDocumentParams params) {
 	public CompletableFuture<String> classFileContents(TextDocumentIdentifier param) {
 		logInfo(">> java/classFileContents");
 		ClassfileContentHandler handler = new ClassfileContentHandler();
-		return  handler.contents(param);
+		return computeAsync((cc) -> handler.contents(param, toMonitor(cc)));
 	}
 
 	/* (non-Javadoc)
@@ -399,4 +405,8 @@ public void sendStatus(ServiceStatus serverStatus, String status) {
 		}
 	}
 
+	private IProgressMonitor toMonitor(CancelChecker checker) {
+		return new CancellableProgressMonitor(checker);
+	}
+
 }
diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/NavigateToDefinitionHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/NavigateToDefinitionHandler.java
index a8efdfc4e7..ae4ce05507 100644
--- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/NavigateToDefinitionHandler.java
+++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/NavigateToDefinitionHandler.java
@@ -12,8 +12,8 @@
 
 import java.util.Arrays;
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.IClassFile;
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.IJavaElement;
@@ -28,16 +28,10 @@
 
 public class NavigateToDefinitionHandler {
 
-	public CompletableFuture<List<? extends Location>> definition(TextDocumentPositionParams position){
-		return CompletableFuture.supplyAsync(()->{
-			return getDefinition(position);
-		});
-	}
-
-	public List<? extends Location> getDefinition(TextDocumentPositionParams position){
+	public List<? extends Location> definition(TextDocumentPositionParams position, IProgressMonitor monitor) {
 		ITypeRoot unit = JDTUtils.resolveTypeRoot(position.getTextDocument().getUri());
 		Location location = null;
-		if(unit != null){
+		if (unit != null && !monitor.isCanceled()) {
 			location = computeDefinitionNavigation(unit, position.getPosition().getLine(),
 					position.getPosition().getCharacter());
 		}
diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/ReferencesHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/ReferencesHandler.java
index a6eccaa687..0cfcd707ba 100644
--- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/ReferencesHandler.java
+++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/ReferencesHandler.java
@@ -16,7 +16,7 @@
 
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.IClassFile;
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.IJavaElement;
@@ -43,7 +43,7 @@ private IJavaSearchScope createSearchScope() throws JavaModelException {
 		return SearchEngine.createJavaSearchScope(projects, IJavaSearchScope.SOURCES | IJavaSearchScope.APPLICATION_LIBRARIES);
 	}
 
-	List<Location> findReferences(ReferenceParams param) {
+	List<Location> findReferences(ReferenceParams param, IProgressMonitor monitor) {
 		SearchEngine engine = new SearchEngine();
 
 		try {
@@ -85,7 +85,7 @@ public void acceptSearchMatch(SearchMatch match) throws CoreException {
 					}
 
 				}
-			}, new NullProgressMonitor());
+					}, monitor);
 
 			return locations;
 		} catch (CoreException e) {
diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/WorkspaceSymbolHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/WorkspaceSymbolHandler.java
index 3cb4f2a019..feadf91439 100644
--- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/WorkspaceSymbolHandler.java
+++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/WorkspaceSymbolHandler.java
@@ -15,7 +15,7 @@
 import java.util.List;
 
 import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.Flags;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.JavaCore;
@@ -34,7 +34,7 @@
 
 public class WorkspaceSymbolHandler{
 
-	public List<SymbolInformation> search(String query) {
+	public List<SymbolInformation> search(String query, IProgressMonitor monitor) {
 		if (query == null || query.trim().isEmpty()) {
 			return Collections.emptyList();
 		}
@@ -77,7 +77,7 @@ private SymbolKind mapKind(TypeNameMatch match) {
 					}
 					return SymbolKind.Class;
 				}
-			}, IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, new NullProgressMonitor());
+			}, IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, monitor);
 			return symbols;
 		} catch (Exception e) {
 			JavaLanguageServerPlugin.logException("Problem getting search for" +  query, e);
diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/ClassfileContentHandlerTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/ClassfileContentHandlerTest.java
index 6bd62889df..1d2a1625c1 100644
--- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/ClassfileContentHandlerTest.java
+++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/ClassfileContentHandlerTest.java
@@ -68,7 +68,7 @@ public void testOpenMissingFile() throws Exception {
 
 	private String getSource(String uri) throws Exception {
 		TextDocumentIdentifier param = new TextDocumentIdentifier(uri);
-		return handler.contents(param).get();
+		return handler.contents(param, monitor);
 	}
 
 }
diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/CodeLensHandlerTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/CodeLensHandlerTest.java
index c9c76435a8..0e069157c9 100644
--- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/CodeLensHandlerTest.java
+++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/CodeLensHandlerTest.java
@@ -107,7 +107,7 @@ public void testGetCodeLensSymbols() throws Exception {
 		String uri = codeLensParams.getTextDocument().getUri();
 		assertFalse(uri.isEmpty());
 		//when
-		List<CodeLens> result = handler.getCodeLensSymbols(uri);
+		List<CodeLens> result = handler.getCodeLensSymbols(uri, monitor);
 
 		//then
 		assertEquals("Found " + result, 3, result.size());
@@ -130,14 +130,14 @@ public void testGetCodeLensSymbols() throws Exception {
 
 	@Test
 	public void testGetCodeLenseBoundaries() {
-		List<CodeLens> result = handler.getCodeLensSymbols(null);
+		List<CodeLens> result = handler.getCodeLensSymbols(null, monitor);
 		assertNotNull(result);
 		assertEquals(0, result.size());
 
 		String payload = createCodeLensSymbolsRequest("src/java/Missing.java");
 		CodeLensParams codeLensParams = getParams(payload);
 		String uri = codeLensParams.getTextDocument().getUri();
-		result = handler.getCodeLensSymbols(uri);
+		result = handler.getCodeLensSymbols(uri, monitor);
 		assertEquals(0, result.size());
 	}
 
@@ -154,7 +154,7 @@ public void testDisableCodeLensSymbols() throws Exception {
 		assertFalse(uri.isEmpty());
 
 		//when
-		List<CodeLens> result = handler.getCodeLensSymbols(uri);
+		List<CodeLens> result = handler.getCodeLensSymbols(uri, monitor);
 
 		//then
 		assertEquals(0, result.size());
@@ -171,7 +171,7 @@ public void testResolveCodeLense() {
 		Range range = lens.getRange();
 		assertRange(5, 13, 16, range);
 
-		CodeLens result = handler.resolve(lens);
+		CodeLens result = handler.resolve(lens, monitor);
 		assertNotNull(result);
 
 		//Check if command found
@@ -203,12 +203,12 @@ public void testResolveCodeLense() {
 
 	@Test
 	public void testResolveCodeLenseBoundaries() {
-		CodeLens result = handler.resolve(null);
+		CodeLens result = handler.resolve(null, monitor);
 		assertNull(result);
 
 		String payload = createCodeLensRequest("src/java/Missing.java", 5, 13, 16);
 		CodeLens lens = getParams(payload);
-		result = handler.resolve(lens);
+		result = handler.resolve(lens, monitor);
 		assertSame(lens, result);
 		assertNull(result.getCommand());
 	}
@@ -220,7 +220,7 @@ public void testIgnoreLombokCodeLensSymbols() throws Exception {
 		String uri = codeLensParams.getTextDocument().getUri();
 		assertFalse(uri.isEmpty());
 		//when
-		List<CodeLens> result = handler.getCodeLensSymbols(uri);
+		List<CodeLens> result = handler.getCodeLensSymbols(uri, monitor);
 
 		//then
 		assertEquals("Found " + result, 4, result.size());
diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentSymbolHandlerTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentSymbolHandlerTest.java
index 07381a747c..9449ea9197 100644
--- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentSymbolHandlerTest.java
+++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentSymbolHandlerTest.java
@@ -15,7 +15,6 @@
 
 import java.io.UnsupportedEncodingException;
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 
 import org.eclipse.core.resources.IProject;
@@ -94,8 +93,7 @@ private List<? extends SymbolInformation> getSymbols(String className)
 		TextDocumentIdentifier identifier = new TextDocumentIdentifier(uri);
 		DocumentSymbolParams params = new DocumentSymbolParams();
 		params.setTextDocument(identifier);
-		CompletableFuture<List<? extends SymbolInformation>> future = handler.documentSymbol(params);
-		List<? extends SymbolInformation> symbols = future.get();
+		List<? extends SymbolInformation> symbols = handler.documentSymbol(params, monitor);
 		assertTrue(symbols.size() > 0);
 		return symbols;
 	}
diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/HoverHandlerTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/HoverHandlerTest.java
index 44854fac1b..e6d9aeee4c 100644
--- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/HoverHandlerTest.java
+++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/HoverHandlerTest.java
@@ -66,7 +66,7 @@ public void testHover() throws Exception {
 		TextDocumentPositionParams position = getParams(payload);
 
 		//when
-		Hover hover = handler.hover(position).get();
+		Hover hover = handler.hover(position, monitor);
 
 		//then
 		assertNotNull(hover);
@@ -83,7 +83,7 @@ public void testHoverStandalone() throws Exception {
 		TextDocumentPositionParams position = getParams(payload);
 
 		//when
-		Hover hover = handler.hover(position).get();
+		Hover hover = handler.hover(position, monitor);
 
 		//then
 		assertNotNull(hover);
@@ -100,7 +100,7 @@ public void testEmptyHover() throws Exception {
 		TextDocumentPositionParams position = getParams(payload);
 
 		//when
-		Hover hover = handler.hover(position).get();
+		Hover hover = handler.hover(position, monitor);
 
 		//then
 		assertNotNull(hover);
@@ -129,7 +129,7 @@ public void testHoverVariable() throws Exception {
 		TextDocumentPositionParams position = getParams(argParam);
 
 		//when
-		Hover hover = handler.hover(position).get();
+		Hover hover = handler.hover(position, monitor);
 
 		//then
 		assertNotNull(hover);
@@ -145,7 +145,7 @@ public void testHoverInheritedJavadoc() throws Exception {
 		TextDocumentPositionParams position = getParams(payload);
 
 		// when
-		Hover hover = handler.hover(position).get();
+		Hover hover = handler.hover(position, monitor);
 
 		// then
 		assertNotNull(hover);
diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/NavigateToDefinitionHandlerTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/NavigateToDefinitionHandlerTest.java
index 598afb68be..38fd129c7d 100644
--- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/NavigateToDefinitionHandlerTest.java
+++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/NavigateToDefinitionHandlerTest.java
@@ -46,8 +46,8 @@ public void setUp() throws Exception {
 
 	@Test
 	public void testGetEmptyDefinition() throws Exception {
-		List<? extends Location> definitions = handler.getDefinition(
-				new TextDocumentPositionParams(new TextDocumentIdentifier("/foo/bar"), "/foo/bar", new Position(1, 1)));
+		List<? extends Location> definitions = handler.definition(
+				new TextDocumentPositionParams(new TextDocumentIdentifier("/foo/bar"), new Position(1, 1)), monitor);
 		assertNotNull(definitions);
 		assertEquals(1, definitions.size());
 		assertNotNull("Location has no Range", definitions.get(0).getRange());
@@ -67,7 +67,7 @@ private void testClass(String className, int line, int column) throws JavaModelE
 		String uri = ClassFileUtil.getURI(project, className);
 		TextDocumentIdentifier identifier = new TextDocumentIdentifier(uri);
 		List<? extends Location> definitions = handler
-				.getDefinition(new TextDocumentPositionParams(identifier, new Position(line, column)));
+				.definition(new TextDocumentPositionParams(identifier, new Position(line, column)), monitor);
 		assertNotNull(definitions);
 		assertEquals(1, definitions.size());
 		assertNotNull(definitions.get(0).getUri());
diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/WorkspaceSymbolHandlerTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/WorkspaceSymbolHandlerTest.java
index 53b3dbafbd..6d877fe8d8 100644
--- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/WorkspaceSymbolHandlerTest.java
+++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/WorkspaceSymbolHandlerTest.java
@@ -40,15 +40,15 @@ public void setup() throws Exception {
 
 	@Test
 	public void testSearchWithEmptyResults() {
-		List<SymbolInformation> results = handler.search(null);
+		List<SymbolInformation> results = handler.search(null, monitor);
 		assertNotNull(results);
 		assertEquals(0, results.size());
 
-		results = handler.search("  ");
+		results = handler.search("  ", monitor);
 		assertNotNull(results);
 		assertEquals(0, results.size());
 
-		results = handler.search("Abracadabra");
+		results = handler.search("Abracadabra", monitor);
 		assertNotNull(results);
 		assertEquals(0, results.size());
 	}
@@ -57,7 +57,7 @@ public void testSearchWithEmptyResults() {
 	@Test
 	public void testWorkspaceSearch() {
 		String query = "Abstract";
-		List<SymbolInformation> results = handler.search(query);
+		List<SymbolInformation> results = handler.search(query, monitor);
 		assertNotNull(results);
 		assertTrue("Found "+ results.size() + " results", results.size() > 100);
 		Range defaultRange = JDTUtils.newRange();
@@ -75,7 +75,7 @@ public void testWorkspaceSearch() {
 	@Test
 	public void testProjectSearch() {
 		String query = "IFoo";
-		List<SymbolInformation> results = handler.search(query);
+		List<SymbolInformation> results = handler.search(query, monitor);
 		assertNotNull(results);
 		assertEquals("Found "+ results.size() + " results", 1, results.size());
 		SymbolInformation symbol = results.get(0);
@@ -89,12 +89,12 @@ public void testProjectSearch() {
 
 	@Test
 	public void testCamelCaseSearch() {
-		List<SymbolInformation> results = handler.search("NPE");
+		List<SymbolInformation> results = handler.search("NPE", monitor);
 		assertNotNull(results);
 		assertEquals("NoPermissionException", results.get(0).getName());
 		assertEquals("NullPointerException", results.get(results.size()-1).getName());
 
-		results = handler.search("HaMa");
+		results = handler.search("HaMa", monitor);
 		String className = "HashMap";
 		boolean foundClass = results.stream().filter(s -> className.equals(s.getName())).findFirst().isPresent();
 		assertTrue("Did not find "+className, foundClass);