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 <kaloyan.r@zend.com>
6.19.x
Kaloyan Raev 2016-10-26 22:09:17 +03:00 committed by Vitalii Parfonov
parent ebe8ed9fac
commit cc5fe6e62f
1 changed files with 22 additions and 7 deletions

View File

@ -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<String> contents = new ArrayList<String>();
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<OrionHoverOverlay>)then;