From d0bcef7910c34a0dcfa07671c05d35ff56f52614 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Thu, 2 Aug 2018 00:51:23 -0400 Subject: [PATCH] PT #159485440: Only update hints if doc versions are matching --- .../ls/eclipse/commons/HighlightParams.java | 12 +++--- .../commons/STS4LanguageClientImpl.java | 41 +++++++++++-------- .../languageserver/HighlightParams.java | 7 ++-- .../java/utils/SpringLiveHoverWatchdog.java | 6 ++- 4 files changed, 40 insertions(+), 26 deletions(-) diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/HighlightParams.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/HighlightParams.java index aa0836a97..a94c17c75 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/HighlightParams.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/HighlightParams.java @@ -13,30 +13,30 @@ package org.springframework.tooling.ls.eclipse.commons; import java.util.List; import org.eclipse.lsp4j.Range; -import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.eclipse.lsp4j.VersionedTextDocumentIdentifier; public class HighlightParams { - + //TODO: Identical copy of this exists in org.springframework.ide.vscode.commons.languageserver.HighlightParams // But because that is only built in plain maven jar (not osgi) we can't use it. We should find a solution // for this somehow (i.e. build a version of some of our 'plain maven' jars as osgi bundles and publish on // a update site. - private TextDocumentIdentifier doc; + private VersionedTextDocumentIdentifier doc; private List ranges; public HighlightParams() { } - public HighlightParams(TextDocumentIdentifier doc, List ranges) { + public HighlightParams(VersionedTextDocumentIdentifier doc, List ranges) { super(); this.doc = doc; this.ranges = ranges; } - public TextDocumentIdentifier getDoc() { + public VersionedTextDocumentIdentifier getDoc() { return doc; } - public void setDoc(TextDocumentIdentifier doc) { + public void setDoc(VersionedTextDocumentIdentifier doc) { this.doc = doc; } public List getRanges() { diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/STS4LanguageClientImpl.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/STS4LanguageClientImpl.java index cca0bd791..d081503c0 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/STS4LanguageClientImpl.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/STS4LanguageClientImpl.java @@ -12,7 +12,6 @@ package org.springframework.tooling.ls.eclipse.commons; import java.lang.reflect.Method; import java.net.URI; -import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -42,6 +41,7 @@ import org.eclipse.lsp4e.LanguageClientImpl; import org.eclipse.lsp4e.LanguageServiceAccessor; import org.eclipse.lsp4e.LanguageServiceAccessor.LSPDocumentInfo; import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.VersionedTextDocumentIdentifier; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IWorkbenchPage; @@ -138,7 +138,7 @@ public class STS4LanguageClientImpl extends LanguageClientImpl implements STS4La * Latest highlight request params. It is sufficient to only remember the last request per uri, because * each new request is expected to replace the previous highlights. */ - private Map> currentHighlights = new HashMap<>(); + private Map currentHighlights = new HashMap<>(); /** * Current markers... indexed per document uri, needed sp we to be removed upon next update. @@ -149,23 +149,32 @@ public class STS4LanguageClientImpl extends LanguageClientImpl implements STS4La private synchronized void updateAnnotations(String target, ISourceViewer sourceViewer, IAnnotationModelExtension annotationModel) { if (target!=null) { + HighlightParams highlightParams = currentHighlights.get(target); IDocument doc = sourceViewer.getDocument(); - Collection infos = LanguageServiceAccessor.getLSPDocumentInfosFor(doc, (x) -> true); - for (LSPDocumentInfo docInfo : infos) { - URI uri = docInfo.getFileUri(); - if (uri!=null && uri.toString().equals(target)) { - Annotation[] toRemove = currentAnnotations.get(target); - if (toRemove==null) { - toRemove = new Annotation[0]; - } - List highlights = currentHighlights.get(target); - Map newAnnotations = createAnnotations(doc, highlights); - annotationModel.replaceAnnotations(toRemove, newAnnotations); - currentAnnotations.put(target, newAnnotations.keySet().toArray(new Annotation[newAnnotations.size()])); - updateInlinedAnnotations(sourceViewer, highlights); + if (isProperDocumentIdFor(doc, highlightParams.getDoc())) { + Annotation[] toRemove = currentAnnotations.get(target); + if (toRemove==null) { + toRemove = new Annotation[0]; + } + List highlights = highlightParams == null ? null : highlightParams.getRanges(); + Map newAnnotations = createAnnotations(doc, highlights); + annotationModel.replaceAnnotations(toRemove, newAnnotations); + currentAnnotations.put(target, newAnnotations.keySet().toArray(new Annotation[newAnnotations.size()])); + updateInlinedAnnotations(sourceViewer, highlights); + } + } + } + + private static boolean isProperDocumentIdFor(IDocument doc, VersionedTextDocumentIdentifier id) { + for (LSPDocumentInfo info : LanguageServiceAccessor.getLSPDocumentInfosFor(doc, (x) -> true)) { + if (info.getVersion() == id.getVersion()) { + URI uri = info.getFileUri(); + if (uri != null && uri.toString().equals(id.getUri())) { + return true; } } } + return false; } private void updateInlinedAnnotations(final ISourceViewer sourceViewer, List highlights) { @@ -247,7 +256,7 @@ public class STS4LanguageClientImpl extends LanguageClientImpl implements STS4La public synchronized void highlight(HighlightParams highlights) { String target = highlights.getDoc().getUri(); if (target!=null) { - currentHighlights.put(target, highlights.getRanges()); + currentHighlights.put(target, highlights); new UpdateHighlights(target); } } diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/HighlightParams.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/HighlightParams.java index bf812f99a..afcf7c964 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/HighlightParams.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/HighlightParams.java @@ -14,16 +14,17 @@ import java.util.List; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.eclipse.lsp4j.VersionedTextDocumentIdentifier; public class HighlightParams { - private TextDocumentIdentifier doc; + private VersionedTextDocumentIdentifier doc; private List ranges; public HighlightParams() { } - public HighlightParams(TextDocumentIdentifier doc, List ranges) { + public HighlightParams(VersionedTextDocumentIdentifier doc, List ranges) { super(); this.doc = doc; this.ranges = ranges; @@ -31,7 +32,7 @@ public class HighlightParams { public TextDocumentIdentifier getDoc() { return doc; } - public void setDoc(TextDocumentIdentifier doc) { + public void setDoc(VersionedTextDocumentIdentifier doc) { this.doc = doc; } public List getRanges() { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringLiveHoverWatchdog.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringLiveHoverWatchdog.java index 4a2a4e704..20185f216 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringLiveHoverWatchdog.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringLiveHoverWatchdog.java @@ -21,6 +21,7 @@ import java.util.stream.Stream; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.eclipse.lsp4j.VersionedTextDocumentIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ide.vscode.boot.java.handlers.BootJavaHoverProvider; @@ -195,7 +196,10 @@ public class SpringLiveHoverWatchdog { } private void publishLiveHints(String docURI, Range[] ranges) { - server.getClient().highlight(new HighlightParams(new TextDocumentIdentifier(docURI), Arrays.asList(ranges))); + int version = server.getTextDocumentService().get(docURI).getVersion(); + VersionedTextDocumentIdentifier id = new VersionedTextDocumentIdentifier(version); + id.setUri(docURI); + server.getClient().highlight(new HighlightParams(id, Arrays.asList(ranges))); } private void cleanupLiveHints(String docURI) {