From cc5fe6e62f481c93b910fe9dfeb6061ff2dcdb1b Mon Sep 17 00:00:00 2001 From: Kaloyan Raev Date: Wed, 26 Oct 2016 22:09:17 +0300 Subject: [PATCH] Render hover messages according to LSP specification. (#2856) If the hover message consists of multiple MarkedStrings then they should be joined via double newline, so they are rendered as seperate Markdown paragraphs. If a MarkedString has the `language` property provided then it should be rendered as a Markdown code block. Signed-off-by: Kaloyan Raev --- .../ide/hover/HoverProvider.java | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/hover/HoverProvider.java b/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/hover/HoverProvider.java index 8373be8743..3f9a96d5dc 100644 --- a/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/hover/HoverProvider.java +++ b/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/hover/HoverProvider.java @@ -10,13 +10,12 @@ *******************************************************************************/ package org.eclipse.che.plugin.languageserver.ide.hover; +import com.google.common.base.Joiner; import com.google.inject.Inject; import com.google.inject.Singleton; import org.eclipse.che.api.languageserver.shared.lsapi.HoverDTO; import org.eclipse.che.api.languageserver.shared.lsapi.MarkedStringDTO; -import org.eclipse.che.api.languageserver.shared.lsapi.PositionDTO; -import org.eclipse.che.api.languageserver.shared.lsapi.TextDocumentIdentifierDTO; import org.eclipse.che.api.languageserver.shared.lsapi.TextDocumentPositionParamsDTO; import org.eclipse.che.api.promises.client.Function; import org.eclipse.che.api.promises.client.FunctionException; @@ -34,6 +33,11 @@ import org.eclipse.che.plugin.languageserver.ide.editor.LanguageServerEditorConf import org.eclipse.che.plugin.languageserver.ide.service.TextDocumentServiceClient; import org.eclipse.che.plugin.languageserver.ide.util.DtoBuildHelper; +import java.util.ArrayList; +import java.util.List; + +import io.typefox.lsapi.MarkedString; + /** * Provides hover LS functionality for Orion editor. * @@ -80,11 +84,7 @@ public class HoverProvider implements OrionHoverHandler { public OrionHoverOverlay apply(HoverDTO arg) throws FunctionException { OrionHoverOverlay hover = OrionHoverOverlay.create(); hover.setType("markdown"); - StringBuilder b = new StringBuilder(); - for (MarkedStringDTO dto : arg.getContents()) { - b.append(dto.getValue()); - } - String content = b.toString(); + String content = renderContent(arg); //do not show hover with only white spaces if (StringUtils.isNullOrWhitespace(content)) { return null; @@ -93,6 +93,21 @@ public class HoverProvider implements OrionHoverHandler { return hover; } + + private String renderContent(HoverDTO hover) { + List contents = new ArrayList(); + for (MarkedStringDTO dto : hover.getContents()) { + String lang = dto.getLanguage(); + if (lang == null || MarkedString.PLAIN_STRING.equals(lang)) { + // plain markdown text + contents.add(dto.getValue()); + } else { + // markdown code block + contents.add("```" + lang + "\n" + dto.getValue() + "\n```"); + } + } + return Joiner.on("\n\n").join(contents); + } }); return (JsPromise)then;