diff --git a/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderable.java b/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderable.java
index 06195392f..59e6c9ac1 100644
--- a/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderable.java
+++ b/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderable.java
@@ -11,8 +11,7 @@
package org.springframework.ide.vscode.commons.util;
/**
- * Placeholder. Still need to figure out what exactly we should do with this in
- * vscode. TODO: rename to Renderable
+ * Renderable can be rendered with various mark-up languages
*/
public interface Renderable {
diff --git a/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderables.java b/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderables.java
index 389917dbc..282676d33 100644
--- a/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderables.java
+++ b/vscode-extensions/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/Renderables.java
@@ -95,6 +95,44 @@ public class Renderables {
}
};
}
+
+ public static Renderable paragraph(Renderable text) {
+ return new Renderable() {
+
+ @Override
+ public void renderAsMarkdown(StringBuilder buffer) {
+ buffer.append("\n");
+ text.renderAsMarkdown(buffer);
+ buffer.append("\n");
+ }
+
+ @Override
+ public void renderAsHtml(HtmlBuffer buffer) {
+ buffer.raw("
");
+ text.renderAsHtml(buffer);
+ buffer.raw("
");
+ }
+ };
+ }
+
+ public static Renderable strikeThrough(Renderable text) {
+ return new Renderable() {
+
+ @Override
+ public void renderAsMarkdown(StringBuilder buffer) {
+ buffer.append("~~");
+ text.renderAsMarkdown(buffer);
+ buffer.append("~~");
+ }
+
+ @Override
+ public void renderAsHtml(HtmlBuffer buffer) {
+ buffer.raw("");
+ text.renderAsHtml(buffer);
+ buffer.raw("");
+ }
+ };
+ }
public static Renderable link(String text, String url) {
return new Renderable() {
@@ -127,7 +165,11 @@ public class Renderables {
@Override
public void renderAsMarkdown(StringBuilder buffer) {
- buffer.append("\n\n");
+ if (buffer.charAt(buffer.length() - 1) != '\n') {
+ // 2 spaces and then new line would create a line break in text
+ buffer.append(" ");
+ }
+ buffer.append("\n");
}
@Override
@@ -230,7 +272,7 @@ public class Renderables {
private Renderable[] pieces;
- ConcatRenderables(Renderable[] pieces) {
+ ConcatRenderables(Renderable... pieces) {
this.pieces = pieces;
}
diff --git a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/hover/YPropertyHoverInfo.java b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/hover/YPropertyHoverInfo.java
index 7eaae4287..6948deb02 100644
--- a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/hover/YPropertyHoverInfo.java
+++ b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/hover/YPropertyHoverInfo.java
@@ -50,6 +50,7 @@ public class YPropertyHoverInfo {
Renderable description = prop.getDescription();
if (description != null) {
+ html.add(lineBreak());
html.add(lineBreak());
html.add(description);
}
diff --git a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/hover/PropertiesHoverCalculator.java b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/hover/PropertiesHoverCalculator.java
index 620abe1e2..2cf3a0424 100644
--- a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/hover/PropertiesHoverCalculator.java
+++ b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/hover/PropertiesHoverCalculator.java
@@ -10,11 +10,11 @@ import java.util.Optional;
import org.springframework.ide.vscode.application.properties.metadata.PropertyInfo;
import org.springframework.ide.vscode.application.properties.metadata.SpringPropertyIndex;
import org.springframework.ide.vscode.application.properties.metadata.hints.StsValueHint;
-import org.springframework.ide.vscode.application.properties.metadata.hover.PropertyRenderableProvider;
import org.springframework.ide.vscode.application.properties.metadata.types.Type;
import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil;
import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil.EnumCaseMode;
import org.springframework.ide.vscode.application.properties.metadata.util.FuzzyMap;
+import org.springframework.ide.vscode.boot.properties.tools.PropertyRenderableProvider;
import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.languageserver.util.BadLocationException;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/hover/AbstractPropertyRenderableProvider.java b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/tools/AbstractPropertyRenderableProvider.java
similarity index 50%
rename from vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/hover/AbstractPropertyRenderableProvider.java
rename to vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/tools/AbstractPropertyRenderableProvider.java
index 7ac1ed12a..37838521b 100644
--- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/hover/AbstractPropertyRenderableProvider.java
+++ b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/tools/AbstractPropertyRenderableProvider.java
@@ -8,16 +8,19 @@
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
-package org.springframework.ide.vscode.application.properties.metadata.hover;
+package org.springframework.ide.vscode.boot.properties.tools;
+
+import static org.springframework.ide.vscode.commons.util.Renderables.*;
import java.util.Collection;
import org.springframework.ide.vscode.commons.java.IJavaProject;
-import org.springframework.ide.vscode.commons.util.HtmlBuffer;
import org.springframework.ide.vscode.commons.util.Renderable;
-import org.springframework.ide.vscode.commons.util.Renderables;
import org.springframework.ide.vscode.commons.util.StringUtil;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableList.Builder;
+
public abstract class AbstractPropertyRenderableProvider {
/**
@@ -27,71 +30,45 @@ public abstract class AbstractPropertyRenderableProvider {
private static final String ACTION_HOST = "action";
public Renderable getRenderable() {
- return new Renderable() {
+ Builder renderableBuilder = ImmutableList.builder();
- @Override
- public void renderAsHtml(HtmlBuffer buffer) {
-// JavaTypeLinks jtLinks = new JavaTypeLinks(this);
-
- renderId(buffer);
-
- String type = getType();
- if (type==null) {
- type = Object.class.getName();
- }
-// jtLinks.javaTypeLink(html, getJavaProject(), type);
- actionLink(buffer, type);
-
- String deflt = formatDefaultValue(getDefaultValue());
- if (deflt!=null) {
- buffer.raw("
");
- buffer.text("Default: ");
- buffer.raw("");
- buffer.text(deflt);
- buffer.raw("");
- }
-
- if (isDeprecated()) {
- buffer.raw("
");
- String reason = getDeprecationReason();
- if (StringUtil.hasText(reason)) {
- buffer.bold("Deprecated: ");
- buffer.text(reason);
- } else {
- buffer.bold("Deprecated!");
- }
- }
-
- Renderable description = getDescription();
- if (description!=null) {
- buffer.raw("
");
- buffer.p(description.toHtml());
- }
-
- }
-
- @Override
- public void renderAsMarkdown(StringBuilder buffer) {
- buffer.append(Renderables.getHtmlToMarkdownConverter().convert(toHtml()));
- }
-
- };
+ renderId(renderableBuilder);
+
+ String type = getType();
+ if (type==null) {
+ type = Object.class.getName();
+ }
+ actionLink(renderableBuilder, type);
+
+ String deflt = formatDefaultValue(getDefaultValue());
+ if (deflt!=null) {
+ defaultValueRenderable(renderableBuilder, deflt);
+ }
+
+ if (isDeprecated()) {
+ depreactionRenderable(renderableBuilder);
+ }
+
+ Renderable description = getDescription();
+ if (description!=null) {
+ descriptionRenderable(renderableBuilder, description);
+ }
+
+ return concat(renderableBuilder.build());
}
- final protected void renderId(HtmlBuffer html) {
- boolean deprecated = isDeprecated();
- String tag = deprecated ? "s" : "b";
- String replacement = getDeprecationReplacement();
-
- html.raw("<"+tag+">");
- html.text(getId());
- html.raw(""+tag+">");
- if (StringUtil.hasText(replacement)) {
- html.text(" -> "+ replacement);
+ final protected void renderId(Builder renderableBuilder) {
+ if (isDeprecated()) {
+ renderableBuilder.add(strikeThrough(text(getId())));
+ String replacement = getDeprecationReplacement();
+ if (StringUtil.hasText(replacement)) {
+ renderableBuilder.add(text(" -> " + replacement));
+ }
+ } else {
+ renderableBuilder.add(bold(text(getId())));
}
- html.raw("
");
}
-
+
protected abstract Object getDefaultValue();
protected abstract IJavaProject getJavaProject();
protected abstract Renderable getDescription();
@@ -125,13 +102,34 @@ public abstract class AbstractPropertyRenderableProvider {
* Creates an 'action' link and adds it to the html buffer. When the user clicks the given
* link then the provided runnable is to be executed.
*/
- public void actionLink(HtmlBuffer html, String displayString/*, Runnable runnable*/) {
-// String actionId = registerAction(runnable);
- html.raw("");
- html.text(displayString);
- html.raw("");
+ public void actionLink(Builder renderableBuilder, String displayString) {
+ String url = "http://"+ACTION_HOST+"/action-id";
+ renderableBuilder.add(lineBreak());
+ renderableBuilder.add(link(displayString, url));
+ }
+
+ private void defaultValueRenderable(Builder renderableBuilder, String defaultValue) {
+ renderableBuilder.add(lineBreak());
+ renderableBuilder.add(lineBreak());
+ renderableBuilder.add(text("Default: "));
+ renderableBuilder.add(italic(text(defaultValue)));
+ }
+
+ private void depreactionRenderable(Builder renderableBuilder) {
+ renderableBuilder.add(lineBreak());
+ renderableBuilder.add(lineBreak());
+ String reason = getDeprecationReason();
+ if (StringUtil.hasText(reason)) {
+ renderableBuilder.add(bold(text("Deprecated: ")));
+ renderableBuilder.add(text(reason));
+ } else {
+ renderableBuilder.add(bold(text("Deprecated!")));
+ }
+ }
+
+ private void descriptionRenderable(Builder renderableBuilder, Renderable description) {
+ renderableBuilder.add(lineBreak());
+ renderableBuilder.add(paragraph(description));
}
}
diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/hover/PropertyRenderableProvider.java b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/tools/PropertyRenderableProvider.java
similarity index 98%
rename from vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/hover/PropertyRenderableProvider.java
rename to vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/tools/PropertyRenderableProvider.java
index 3bd66282f..8a3f55ee4 100644
--- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/hover/PropertyRenderableProvider.java
+++ b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/properties/tools/PropertyRenderableProvider.java
@@ -8,7 +8,7 @@
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
-package org.springframework.ide.vscode.application.properties.metadata.hover;
+package org.springframework.ide.vscode.boot.properties.tools;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java
index 4a5e7016e..63ff9933d 100644
--- a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java
+++ b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java
@@ -25,7 +25,6 @@ import org.springframework.ide.vscode.application.properties.metadata.completion
import org.springframework.ide.vscode.application.properties.metadata.hints.HintProvider;
import org.springframework.ide.vscode.application.properties.metadata.hints.StsValueHint;
import org.springframework.ide.vscode.application.properties.metadata.hints.ValueHintHoverInfo;
-import org.springframework.ide.vscode.application.properties.metadata.hover.PropertyRenderableProvider;
import org.springframework.ide.vscode.application.properties.metadata.types.Type;
import org.springframework.ide.vscode.application.properties.metadata.types.TypeParser;
import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil;
@@ -34,6 +33,7 @@ import org.springframework.ide.vscode.application.properties.metadata.types.Type
import org.springframework.ide.vscode.application.properties.metadata.types.TypedProperty;
import org.springframework.ide.vscode.application.properties.metadata.util.FuzzyMap;
import org.springframework.ide.vscode.application.properties.metadata.util.FuzzyMap.Match;
+import org.springframework.ide.vscode.boot.properties.tools.PropertyRenderableProvider;
import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
import org.springframework.ide.vscode.commons.languageserver.completion.LazyProposalApplier;
diff --git a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/JavaTypeNavigationHoverInfo.java b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/JavaTypeNavigationHoverInfo.java
index 4dc571373..8ba3aa4ca 100644
--- a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/JavaTypeNavigationHoverInfo.java
+++ b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/JavaTypeNavigationHoverInfo.java
@@ -18,11 +18,11 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.boot.configurationmetadata.Deprecation;
-import org.springframework.ide.vscode.application.properties.metadata.hover.AbstractPropertyRenderableProvider;
import org.springframework.ide.vscode.application.properties.metadata.types.Type;
import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil;
import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil.BeanPropertyNameMode;
import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil.EnumCaseMode;
+import org.springframework.ide.vscode.boot.properties.tools.AbstractPropertyRenderableProvider;
import org.springframework.ide.vscode.application.properties.metadata.types.TypedProperty;
import org.springframework.ide.vscode.commons.java.IField;
import org.springframework.ide.vscode.commons.java.IJavaElement;
diff --git a/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java b/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java
index 31160c7cf..95a18db46 100644
--- a/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java
+++ b/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationPropertiesEditorTest.java
@@ -29,7 +29,6 @@ import org.springframework.ide.vscode.application.properties.metadata.Properties
import org.springframework.ide.vscode.boot.BootPropertiesLanguageServer;
import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.java.IType;
-import org.springframework.ide.vscode.commons.languageserver.hover.VscodeHoverEngineAdapter.HoverType;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer;
import org.springframework.ide.vscode.commons.maven.java.MavenJavaProject;
import org.springframework.ide.vscode.languageserver.testharness.Editor;
@@ -180,10 +179,10 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest {
);
//Case 1: an 'exact' match of the property is in the hover region
editor.assertHoverText("server.",
- "server.port"
+ "**server.port**"
);
//Case 2: an object/map property has extra text after the property name
- editor.assertHoverText("logging.", "logging.level");
+ editor.assertHoverText("logging.", "**logging.level**");
}
@Test public void testHoverInfosWithSpaces() throws Exception {
@@ -197,10 +196,10 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest {
);
//Case 1: an 'exact' match of the property is in the hover region
editor.assertHoverText("server.",
- "server.port"
+ "**server.port**"
);
//Case 2: an object/map property has extra text after the property name
- editor.assertHoverText("logging.", "logging.level");
+ editor.assertHoverText("logging.", "**logging.level**");
}
@Test public void testHoverLongAndShort() throws Exception {
@@ -210,8 +209,8 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest {
"server.port=8080\n" +
"server.port.fancy=true\n"
);
- editor.assertHoverText("server.", "server.port");
- editor.assertHoverText("port.fa", "server.port.fancy");
+ editor.assertHoverText("server.", "**server.port**");
+ editor.assertHoverText("port.fa", "**server.port.fancy**");
}
@@ -924,18 +923,18 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest {
);
deprecate("error.path", "server.error.path", null);
- editor.assertHoverText("path", "error.path -> server.error.path");
- editor.assertHoverText("path", "Deprecated!");
+ editor.assertHoverText("path", "~~error.path~~ -> server.error.path");
+ editor.assertHoverText("path", "**Deprecated!**");
deprecate("error.path", "server.error.path", "This is old.");
- editor.assertHoverText("path", "error.path -> server.error.path");
- editor.assertHoverText("path", "Deprecated: This is old");
+ editor.assertHoverText("path", "~~error.path~~ -> server.error.path");
+ editor.assertHoverText("path", "**Deprecated: **This is old");
deprecate("error.path", null, "This is old.");
- editor.assertHoverText("path", "Deprecated: This is old");
+ editor.assertHoverText("path", "**Deprecated: **This is old");
deprecate("error.path", null, null);
- editor.assertHoverText("path", "Deprecated!");
+ editor.assertHoverText("path", "**Deprecated!**");
}
@Ignore @Test public void testDeprecatedPropertyQuickfix() throws Exception {
@@ -1573,7 +1572,6 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest {
protected SimpleLanguageServer newLanguageServer() {
BootPropertiesLanguageServer server = new BootPropertiesLanguageServer(md.getIndexProvider(), typeUtilProvider, javaProjectFinder);
server.setMaxCompletionsNumber(-1);
- server.setHoverType(HoverType.HTML);
return server;
}