Bug 560366: Adapt LSP4E to new API in LSP4J

The request methods in LSP now have type specific names, therefore
we have to pass those type specific names to the methods.

e.g. to call documentHighlight, we have to use DocumentHighlightParams
instead of the generic TextDocumentPositionParams

Change-Id: I1352309483278116ac486e09ad50d62edb35a313
diff --git a/org.eclipse.lsp4e.tests.mock/src/org/eclipse/lsp4e/tests/mock/MockTextDocumentService.java b/org.eclipse.lsp4e.tests.mock/src/org/eclipse/lsp4e/tests/mock/MockTextDocumentService.java
index 10c1309..7e514b5 100644
--- a/org.eclipse.lsp4e.tests.mock/src/org/eclipse/lsp4e/tests/mock/MockTextDocumentService.java
+++ b/org.eclipse.lsp4e.tests.mock/src/org/eclipse/lsp4e/tests/mock/MockTextDocumentService.java
@@ -31,6 +31,7 @@
 import org.eclipse.lsp4j.CompletionItem;
 import org.eclipse.lsp4j.CompletionList;
 import org.eclipse.lsp4j.CompletionParams;
+import org.eclipse.lsp4j.DefinitionParams;
 import org.eclipse.lsp4j.Diagnostic;
 import org.eclipse.lsp4j.DidChangeTextDocumentParams;
 import org.eclipse.lsp4j.DidCloseTextDocumentParams;
@@ -39,6 +40,7 @@
 import org.eclipse.lsp4j.DocumentColorParams;
 import org.eclipse.lsp4j.DocumentFormattingParams;
 import org.eclipse.lsp4j.DocumentHighlight;
+import org.eclipse.lsp4j.DocumentHighlightParams;
 import org.eclipse.lsp4j.DocumentLink;
 import org.eclipse.lsp4j.DocumentLinkParams;
 import org.eclipse.lsp4j.DocumentOnTypeFormattingParams;
@@ -46,9 +48,11 @@
 import org.eclipse.lsp4j.DocumentSymbol;
 import org.eclipse.lsp4j.DocumentSymbolParams;
 import org.eclipse.lsp4j.Hover;
+import org.eclipse.lsp4j.HoverParams;
 import org.eclipse.lsp4j.Location;
 import org.eclipse.lsp4j.LocationLink;
 import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.PrepareRenameParams;
 import org.eclipse.lsp4j.PrepareRenameResult;
 import org.eclipse.lsp4j.PublishDiagnosticsParams;
 import org.eclipse.lsp4j.Range;
@@ -57,8 +61,8 @@
 import org.eclipse.lsp4j.SignatureHelp;
 import org.eclipse.lsp4j.SignatureHelpParams;
 import org.eclipse.lsp4j.SymbolInformation;
-import org.eclipse.lsp4j.TextDocumentPositionParams;
 import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.TypeDefinitionParams;
 import org.eclipse.lsp4j.WorkspaceEdit;
 import org.eclipse.lsp4j.jsonrpc.messages.Either;
 import org.eclipse.lsp4j.services.LanguageClient;
@@ -116,7 +120,7 @@
 	}
 
 	@Override
-	public CompletableFuture<Hover> hover(TextDocumentPositionParams position) {
+	public CompletableFuture<Hover> hover(HoverParams position) {
 		return CompletableFuture.completedFuture(mockHover);
 	}
 
@@ -127,7 +131,7 @@
 
 	@Override
 	public CompletableFuture<Either<List<? extends Location>, List<? extends LocationLink>>> definition(
-			TextDocumentPositionParams position) {
+			DefinitionParams position) {
 		return CompletableFuture.completedFuture(Either.forLeft(mockDefinitionLocations));
 	}
 
@@ -137,7 +141,7 @@
 	}
 
 	@Override
-	public CompletableFuture<List<? extends DocumentHighlight>> documentHighlight(TextDocumentPositionParams position) {
+	public CompletableFuture<List<? extends DocumentHighlight>> documentHighlight(DocumentHighlightParams position) {
 		return CompletableFuture.completedFuture(mockDocumentHighlights);
 	}
 
@@ -196,7 +200,7 @@
 	}
 
 	@Override
-	public CompletableFuture<Either<Range, PrepareRenameResult>> prepareRename(TextDocumentPositionParams params) {
+	public CompletableFuture<Either<Range, PrepareRenameResult>> prepareRename(PrepareRenameParams params) {
 		if (this.mockPrepareRenameResult == null) {
 			return CompletableFuture.completedFuture(null);
 		} else {
@@ -247,7 +251,7 @@
 
 	@Override
 	public CompletableFuture<Either<List<? extends Location>, List<? extends LocationLink>>> typeDefinition(
-			TextDocumentPositionParams position) {
+			TypeDefinitionParams position) {
 		return CompletableFuture.completedFuture(Either.forRight(this.mockTypeDefinitions));
 	}
 
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java
index f5c7b6e..0e147ab 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java
@@ -68,8 +68,10 @@
 import org.eclipse.lsp4j.Color;
 import org.eclipse.lsp4j.CompletionParams;
 import org.eclipse.lsp4j.CreateFile;
+import org.eclipse.lsp4j.DefinitionParams;
 import org.eclipse.lsp4j.DeleteFile;
 import org.eclipse.lsp4j.DiagnosticSeverity;
+import org.eclipse.lsp4j.HoverParams;
 import org.eclipse.lsp4j.Location;
 import org.eclipse.lsp4j.LocationLink;
 import org.eclipse.lsp4j.MarkupContent;
@@ -82,6 +84,7 @@
 import org.eclipse.lsp4j.TextDocumentIdentifier;
 import org.eclipse.lsp4j.TextDocumentPositionParams;
 import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.TypeDefinitionParams;
 import org.eclipse.lsp4j.VersionedTextDocumentIdentifier;
 import org.eclipse.lsp4j.WorkspaceEdit;
 import org.eclipse.lsp4j.WorkspaceFolder;
@@ -218,6 +221,10 @@
 		return param;
 	}
 
+	public static HoverParams toHoverParams(int offset, IDocument document) throws BadLocationException {
+		return toTextDocumentPositionParamsCommon(new HoverParams(), offset, document);
+	}
+
 	public static SignatureHelpParams toSignatureHelpParams(int offset, IDocument document)
 			throws BadLocationException {
 		return toTextDocumentPositionParamsCommon(new SignatureHelpParams(), offset, document);
@@ -228,6 +235,32 @@
 		return toTextDocumentPositionParamsCommon(new TextDocumentPositionParams(), offset, document);
 	}
 
+	public static DefinitionParams toDefinitionParams(TextDocumentPositionParams params) {
+		return toTextDocumentPositionParamsCommon(new DefinitionParams(), params);
+	}
+
+	public static TypeDefinitionParams toTypeDefinitionParams(TextDocumentPositionParams params) {
+		return toTextDocumentPositionParamsCommon(new TypeDefinitionParams(), params);
+	}
+
+	/**
+	 * Convert generic TextDocumentPositionParams to type specific version. Should
+	 * only be used for T where T adds no new fields.
+	 */
+	private static <T extends TextDocumentPositionParams> T toTextDocumentPositionParamsCommon(
+			@NonNull T specificParams, TextDocumentPositionParams genericParams) {
+		if (genericParams.getPosition() != null) {
+			specificParams.setPosition(genericParams.getPosition());
+		}
+		if (genericParams.getTextDocument() != null) {
+			specificParams.setTextDocument(genericParams.getTextDocument());
+		}
+		if (genericParams.getUri() != null) {
+			specificParams.setUri(genericParams.getUri());
+		}
+		return specificParams;
+	}
+
 	public static URI toUri(IDocument document) {
 		IFile file = getFile(document);
 		if (file != null) {
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/declaration/OpenDeclarationHyperlinkDetector.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/declaration/OpenDeclarationHyperlinkDetector.java
index b8edecc..d240bbd 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/declaration/OpenDeclarationHyperlinkDetector.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/declaration/OpenDeclarationHyperlinkDetector.java
@@ -72,12 +72,12 @@
 				LanguageServiceAccessor
 					.getLanguageServers(textViewer.getDocument(), capabilities -> Boolean.TRUE.equals(capabilities.getDefinitionProvider()))
 					.thenAcceptAsync(languageServers ->
-						languageServers.stream().map(ls -> ls.getTextDocumentService().definition(params)).forEach(allFutures::add)
+						languageServers.stream().map(ls -> ls.getTextDocumentService().definition(LSPEclipseUtils.toDefinitionParams(params))).forEach(allFutures::add)
 					),
 				LanguageServiceAccessor
 					.getLanguageServers(textViewer.getDocument(), OpenDeclarationHyperlinkDetector::isTypeDefinitionProvider)
 					.thenAcceptAsync(languageServers ->
-						languageServers.stream().map(ls -> ls.getTextDocumentService().typeDefinition(params)).forEach(allFutures::add)
+						languageServers.stream().map(ls -> ls.getTextDocumentService().typeDefinition(LSPEclipseUtils.toTypeDefinitionParams(params))).forEach(allFutures::add)
 					)
 			).thenCompose(theVoid ->
 				CompletableFuture.allOf(allFutures.stream().map(future ->
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/highlight/HighlightReconcilingStrategy.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/highlight/HighlightReconcilingStrategy.java
index 43c1ca6..8e841e6 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/highlight/HighlightReconcilingStrategy.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/highlight/HighlightReconcilingStrategy.java
@@ -50,9 +50,9 @@
 import org.eclipse.lsp4e.LanguageServiceAccessor;

 import org.eclipse.lsp4j.DocumentHighlight;

 import org.eclipse.lsp4j.DocumentHighlightKind;

+import org.eclipse.lsp4j.DocumentHighlightParams;

 import org.eclipse.lsp4j.Position;

 import org.eclipse.lsp4j.TextDocumentIdentifier;

-import org.eclipse.lsp4j.TextDocumentPositionParams;

 import org.eclipse.swt.custom.StyledText;

 

 /**

@@ -198,7 +198,7 @@
 			return;

 		}

 		TextDocumentIdentifier identifier = new TextDocumentIdentifier(uri.toString());

-		TextDocumentPositionParams params = new TextDocumentPositionParams(identifier, position);

+		DocumentHighlightParams params = new DocumentHighlightParams(identifier, position);

 		request = LanguageServiceAccessor.getLanguageServers(document,

 				capabilities -> Boolean.TRUE.equals(capabilities.getDocumentHighlightProvider()))

 				.thenAcceptAsync(languageServers ->

diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/hover/LSPTextHover.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/hover/LSPTextHover.java
index 4e1dd5b..63ffb03 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/hover/LSPTextHover.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/hover/LSPTextHover.java
@@ -233,7 +233,7 @@
 					.map(languageServer -> {
 						try {
 								return languageServer.getTextDocumentService()
-										.hover(LSPEclipseUtils.toTextDocumentPosistionParams(offset, document)).get();
+										.hover(LSPEclipseUtils.toHoverParams(offset, document)).get();
 						} catch (ExecutionException | BadLocationException e) {
 							LanguageServerPlugin.logError(e);
 							return null;
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/rename/LSPRenameProcessor.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/rename/LSPRenameProcessor.java
index 1de512f..9952475 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/rename/LSPRenameProcessor.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/rename/LSPRenameProcessor.java
@@ -30,13 +30,13 @@
 import org.eclipse.lsp4e.LanguageServerPlugin;

 import org.eclipse.lsp4e.LanguageServiceAccessor;

 import org.eclipse.lsp4e.ui.Messages;

+import org.eclipse.lsp4j.PrepareRenameParams;

 import org.eclipse.lsp4j.PrepareRenameResult;

 import org.eclipse.lsp4j.Range;

 import org.eclipse.lsp4j.RenameOptions;

 import org.eclipse.lsp4j.RenameParams;

 import org.eclipse.lsp4j.ServerCapabilities;

 import org.eclipse.lsp4j.TextDocumentIdentifier;

-import org.eclipse.lsp4j.TextDocumentPositionParams;

 import org.eclipse.lsp4j.WorkspaceEdit;

 import org.eclipse.lsp4j.jsonrpc.ResponseErrorException;

 import org.eclipse.lsp4j.jsonrpc.messages.Either;

@@ -106,7 +106,7 @@
 				// check if prepareRename is supported by the active LSP

 				if (languageServer.equals(serverToTry)) {

 					TextDocumentIdentifier identifier = new TextDocumentIdentifier(LSPEclipseUtils.toUri(document).toString());

-					TextDocumentPositionParams params = new TextDocumentPositionParams();

+					PrepareRenameParams params = new PrepareRenameParams();

 					params.setTextDocument(identifier);

 					params.setPosition(LSPEclipseUtils.toPosition(offset, document));

 					prepareRenameResult = languageServer.getTextDocumentService().prepareRename(params).get(1000, TimeUnit.MILLISECONDS);