From 45ebcbf6979fbf3d3fe2be3665277024737c289f Mon Sep 17 00:00:00 2001 From: Poytr1 <932446461@qq.com> Date: Thu, 30 Aug 2018 14:56:33 +0800 Subject: [PATCH] add range to hover and full result --- .../internal/DetailSymbolInformation.java | 18 ++++++ .../core/internal/ExtendedHoverHandler.java | 61 +++++++++++++++++++ .../internal/ExtendedJDTLanguageServer.java | 10 +++ .../jdt/ls/core/internal/FullHandler.java | 19 +++--- 4 files changed, 99 insertions(+), 9 deletions(-) create mode 100644 org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/ExtendedHoverHandler.java diff --git a/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/DetailSymbolInformation.java b/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/DetailSymbolInformation.java index 98bda1b3..b0946670 100644 --- a/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/DetailSymbolInformation.java +++ b/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/DetailSymbolInformation.java @@ -4,6 +4,7 @@ import org.eclipse.lsp4j.MarkedString; import org.eclipse.lsp4j.MarkupContent; +import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.eclipse.lsp4j.jsonrpc.validation.NonNull; @@ -15,6 +16,9 @@ public class DetailSymbolInformation { // optional private Either>, MarkupContent> contents; + + // optional + private Range range; public DetailSymbolInformation(@NonNull final SymbolInformation symbolInformation) { this.setSymbolInformation(symbolInformation); @@ -29,6 +33,12 @@ public DetailSymbolInformation(@NonNull final SymbolInformation symbolInformatio this.setContents(contents); this.setSymbolInformation(symbolInformation); } + + public DetailSymbolInformation(@NonNull final SymbolInformation symbolInformation, final List> contents, final Range range) { + this.setContents(contents); + this.setSymbolInformation(symbolInformation); + this.setRange(range); + } public void setSymbolInformation(@NonNull final SymbolInformation symbolInformation) { this.symbolInformation = symbolInformation; @@ -50,5 +60,13 @@ public void setContents(final List> contents) { public Either>, MarkupContent> getContents() { return this.contents; } + + public void setRange(Range range) { + this.range = range; + } + + public Range getRange() { + return this.range; + } } diff --git a/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/ExtendedHoverHandler.java b/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/ExtendedHoverHandler.java new file mode 100644 index 00000000..700c91bf --- /dev/null +++ b/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/ExtendedHoverHandler.java @@ -0,0 +1,61 @@ +package org.elastic.jdt.ls.core.internal; + +import org.eclipse.lsp4j.Hover; +import org.eclipse.lsp4j.Location; +import org.eclipse.lsp4j.TextDocumentPositionParams; + +import com.google.common.base.Charsets; +import com.google.common.io.Files; + +import java.io.File; +import java.io.IOException; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jdt.core.ITypeRoot; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.dom.ASTNode; +import org.eclipse.jdt.core.dom.ASTParser; +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.NodeFinder; +import org.eclipse.jdt.internal.corext.dom.IASTSharedValues; +import org.eclipse.jdt.ls.core.internal.JDTUtils; +import org.eclipse.jdt.ls.core.internal.ResourceUtils; +import org.eclipse.jdt.ls.core.internal.handlers.HoverHandler; +import org.eclipse.jdt.ls.core.internal.handlers.JsonRpcHelpers; +import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager; + + +public class ExtendedHoverHandler extends HoverHandler { + + private final PreferenceManager preferenceManager; + + public ExtendedHoverHandler(PreferenceManager preferenceManager) { + super(preferenceManager); + this.preferenceManager = preferenceManager; + } + + public Hover extendedHover(TextDocumentPositionParams position, IProgressMonitor monitor) { + Hover hover = this.hover(position, monitor); + String uri = position.getTextDocument().getUri(); + ITypeRoot unit = JDTUtils.resolveTypeRoot(uri); + // use nodefinder to get the covering node + if (unit != null && !monitor.isCanceled()) { + try { + File file = ResourceUtils.toFile(JDTUtils.toURI(uri)); + String content = Files.toString(file, Charsets.UTF_8); + ASTParser parser = ASTParser.newParser(IASTSharedValues.SHARED_AST_LEVEL); + char[] source = content.toCharArray(); + parser.setIgnoreMethodBodies(false); + parser.setSource(source); + CompilationUnit ast = (CompilationUnit) parser.createAST(null); + NodeFinder fNodeFinder = new NodeFinder(ast, JsonRpcHelpers.toOffset(unit.getBuffer(), position.getPosition().getLine(), position.getPosition().getCharacter()), 0); + ASTNode node = fNodeFinder.getCoveringNode(); + hover.setRange(JDTUtils.toRange(unit, node.getStartPosition(), node.getLength())); + } catch (JavaModelException | IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return hover; + } +} diff --git a/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/ExtendedJDTLanguageServer.java b/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/ExtendedJDTLanguageServer.java index 88a728b3..5e15c73c 100644 --- a/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/ExtendedJDTLanguageServer.java +++ b/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/ExtendedJDTLanguageServer.java @@ -14,16 +14,19 @@ import org.eclipse.jdt.ls.core.internal.CancellableProgressMonitor; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.jdt.ls.core.internal.handlers.DocumentLifeCycleHandler; +import org.eclipse.jdt.ls.core.internal.handlers.HoverHandler; import org.eclipse.jdt.ls.core.internal.handlers.JDTLanguageServer; import org.eclipse.jdt.ls.core.internal.handlers.NavigateToDefinitionHandler; import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager; import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager; +import org.eclipse.lsp4j.Hover; import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.TextDocumentPositionParams; import org.eclipse.lsp4j.jsonrpc.CancelChecker; import org.eclipse.lsp4j.jsonrpc.CompletableFutures; import org.eclipse.lsp4j.jsonrpc.services.JsonRequest; + public class ExtendedJDTLanguageServer extends JDTLanguageServer { private PreferenceManager preferenceManager; @@ -33,6 +36,13 @@ public ExtendedJDTLanguageServer(ProjectsManager projects, PreferenceManager pre this.preferenceManager = preferenceManager; } + @Override + public CompletableFuture hover(TextDocumentPositionParams position) { + logInfo(">> document/hover"); + ExtendedHoverHandler handler = new ExtendedHoverHandler(this.preferenceManager); + return computeAsync((monitor) -> handler.extendedHover(position, monitor)); + } + @Override public CompletableFuture> definition(TextDocumentPositionParams position) { logInfo(">> document/definition"); diff --git a/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/FullHandler.java b/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/FullHandler.java index 5619209b..6bc315d6 100644 --- a/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/FullHandler.java +++ b/org.elastic.jdt.ls.core/src/org/elastic/jdt/ls/core/internal/FullHandler.java @@ -18,18 +18,17 @@ import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.SimpleType; import org.eclipse.jdt.internal.corext.dom.IASTSharedValues; -import org.eclipse.jdt.ls.core.internal.HoverInfoProvider; import org.eclipse.jdt.ls.core.internal.JDTUtils; import org.eclipse.jdt.ls.core.internal.ResourceUtils; import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager; import org.eclipse.jdt.ls.core.internal.handlers.DocumentSymbolHandler; import org.eclipse.lsp4j.DocumentSymbolParams; +import org.eclipse.lsp4j.Hover; import org.eclipse.lsp4j.Location; -import org.eclipse.lsp4j.MarkedString; import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.TextDocumentIdentifier; -import org.eclipse.lsp4j.jsonrpc.messages.Either; +import org.eclipse.lsp4j.TextDocumentPositionParams; import org.elastic.jdt.ls.core.internal.hover.JavaElementLabels; import com.google.common.base.Charsets; @@ -45,11 +44,12 @@ public FullHandler(PreferenceManager preferenceManager) { public Full full(FullParams fullParams, IProgressMonitor monitor) { TextDocumentIdentifier textDocument = fullParams.getTextDocumentIdentifier(); - ITypeRoot unit = JDTUtils.resolveTypeRoot(textDocument.getUri()); + String uri = textDocument.getUri(); + ITypeRoot unit = JDTUtils.resolveTypeRoot(uri); List symbols = this.documentSymbol(new DocumentSymbolParams(textDocument), monitor); List detailInfos = new ArrayList<>(); for (SymbolInformation symbol : symbols) { - DetailSymbolInformation detailInfo = createDetailSymbol(unit, symbol, monitor); + DetailSymbolInformation detailInfo = createDetailSymbol(symbol, textDocument, monitor); detailInfos.add(detailInfo); } List allReferences = getAllReferences(monitor, textDocument); @@ -124,12 +124,13 @@ private boolean addReferenceOfNode(int start, int length) { return allReferences; } - private DetailSymbolInformation createDetailSymbol(ITypeRoot unit, SymbolInformation symbol, IProgressMonitor monitor) { + private DetailSymbolInformation createDetailSymbol(SymbolInformation symbol, TextDocumentIdentifier textDocument, IProgressMonitor monitor) { + ExtendedHoverHandler hoverHandler = new ExtendedHoverHandler(this.preferenceManager); int line = symbol.getLocation().getRange().getStart().getLine(); int column = symbol.getLocation().getRange().getStart().getCharacter(); - HoverInfoProvider provider = new HoverInfoProvider(unit, this.preferenceManager); - List> contents = provider.computeHover(line, column, monitor); - DetailSymbolInformation detailSymbolInfo = new DetailSymbolInformation(symbol, contents); + TextDocumentPositionParams position = new TextDocumentPositionParams(textDocument, new Position(line, column)); + Hover hover = hoverHandler.extendedHover(position, monitor); + DetailSymbolInformation detailSymbolInfo = new DetailSymbolInformation(symbol, hover.getContents().getLeft(), hover.getRange()); return detailSymbolInfo; }