From b2e7c9ec68b8069c25d8815d9a90734b8109dd5f Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Mon, 27 Nov 2017 08:19:01 +0100 Subject: [PATCH] fixed live hovers for property values in value annotations, but excluded live hints for that for now --- .../boot/java/value/ValueHoverProvider.java | 66 ++++++++++--------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/value/ValueHoverProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/value/ValueHoverProvider.java index 4ebe853d2..b67050379 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/value/ValueHoverProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/value/ValueHoverProvider.java @@ -10,26 +10,29 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java.value; -import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.Iterator; -import java.util.List; +import java.util.Map; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.MemberValuePair; +import org.eclipse.jdt.core.dom.NodeFinder; import org.eclipse.jdt.core.dom.StringLiteral; import org.eclipse.lsp4j.Hover; -import org.eclipse.lsp4j.MarkedString; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.json.JSONObject; import org.springframework.ide.vscode.boot.java.handlers.HoverProvider; +import org.springframework.ide.vscode.boot.java.livehover.LiveHoverUtils; import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.util.text.TextDocument; +import com.google.common.collect.ImmutableList; + /** * @author Martin Lippert */ @@ -40,17 +43,19 @@ public class ValueHoverProvider implements HoverProvider { TextDocument doc, IJavaProject project, SpringBootApp[] runningApps) { try { + ASTNode exactNode = NodeFinder.perform(node, offset, 0); + // case: @Value("prefix<*>") - if (node instanceof StringLiteral && node.getParent() instanceof Annotation) { - if (node.toString().startsWith("\"") && node.toString().endsWith("\"")) { - return provideHover(node.toString(), offset - node.getStartPosition(), node.getStartPosition(), doc, runningApps); + if (exactNode != null && exactNode instanceof StringLiteral && exactNode.getParent() instanceof Annotation) { + if (exactNode.toString().startsWith("\"") && exactNode.toString().endsWith("\"")) { + return provideHover(exactNode.toString(), offset - exactNode.getStartPosition(), exactNode.getStartPosition(), doc, runningApps); } } // case: @Value(value="prefix<*>") - else if (node instanceof StringLiteral && node.getParent() instanceof MemberValuePair - && "value".equals(((MemberValuePair)node.getParent()).getName().toString())) { - if (node.toString().startsWith("\"") && node.toString().endsWith("\"")) { - return provideHover(node.toString(), offset - node.getStartPosition(), node.getStartPosition(), doc, runningApps); + else if (exactNode != null && exactNode instanceof StringLiteral && exactNode.getParent() instanceof MemberValuePair + && "value".equals(((MemberValuePair)exactNode.getParent()).getName().toString())) { + if (exactNode.toString().startsWith("\"") && exactNode.toString().endsWith("\"")) { + return provideHover(exactNode.toString(), offset - exactNode.getStartPosition(), exactNode.getStartPosition(), doc, runningApps); } } } @@ -74,36 +79,37 @@ public class ValueHoverProvider implements HoverProvider { String propertyKey = value.substring(range.getStart(), range.getEnd()); if (propertyKey != null) { - JSONObject[] allProperties = getPropertiesFromProcesses(runningApps); + Map allProperties = getPropertiesFromProcesses(runningApps); - List> hoverContent = new ArrayList<>(); + StringBuilder hover = new StringBuilder(); - for (int i = 0; i < allProperties.length; i++) { - Iterator keys = allProperties[i].keys(); + for (SpringBootApp app : allProperties.keySet()) { + JSONObject properties = allProperties.get(app); + Iterator keys = properties.keys(); while (keys.hasNext()) { String key = (String) keys.next(); - if (allProperties[i].get(key) instanceof JSONObject) { - JSONObject props = allProperties[i].getJSONObject(key); + if (properties.get(key) instanceof JSONObject) { + JSONObject props = properties.getJSONObject(key); if (props.has(propertyKey)) { String propertyValue = props.getString(propertyKey); - hoverContent.add(Either.forLeft("property value for " + propertyKey)); - hoverContent.add(Either.forLeft(propertyValue)); - hoverContent.add(Either.forLeft("coming from:")); - hoverContent.add(Either.forLeft(key)); + hover.append(propertyKey + " : " + propertyValue); + hover.append(" (from: " + key + ")\n\n"); + hover.append(LiveHoverUtils.niceAppName(app)); + hover.append("\n\n"); } } } } - Range hoverRange = doc.toRange(nodeStartOffset + range.getStart(), range.getEnd() - range.getStart()); - Hover hover = new Hover(); + if (hover.length() > 0) { + Range hoverRange = doc.toRange(nodeStartOffset + range.getStart(), range.getEnd() - range.getStart()); + Hover result = new Hover(ImmutableList.of(Either.forLeft(hover.toString()))); + result.setRange(hoverRange); - hover.setContents(hoverContent); - hover.setRange(hoverRange); - - return hover; + return result; + } } } } @@ -114,8 +120,8 @@ public class ValueHoverProvider implements HoverProvider { return null; } - public JSONObject[] getPropertiesFromProcesses(SpringBootApp[] runningApps) { - List result = new ArrayList<>(); + public Map getPropertiesFromProcesses(SpringBootApp[] runningApps) { + Map result = new HashMap<>(); try { for (SpringBootApp app : runningApps) { @@ -123,7 +129,7 @@ public class ValueHoverProvider implements HoverProvider { if (environment != null) { JSONObject env = new JSONObject(environment); if (env != null) { - result.add(env); + result.put(app, env); } } } @@ -132,7 +138,7 @@ public class ValueHoverProvider implements HoverProvider { e.printStackTrace(); } - return result.toArray(new JSONObject[result.size()]); + return result; } public String getPropertyKey(String value, int offset) {