From dc8550f706891bb5fccc3ded38d5b7fafa8cacea Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Tue, 28 Aug 2018 14:51:37 -0400 Subject: [PATCH] Eclipse CodeLens action for "sts.open.url" command --- .../META-INF/MANIFEST.MF | 1 + .../commons/HighlightsCodeLensProvider.java | 40 +++++++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/META-INF/MANIFEST.MF b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/META-INF/MANIFEST.MF index aed02118b..49778e4df 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/META-INF/MANIFEST.MF +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/META-INF/MANIFEST.MF @@ -30,3 +30,4 @@ Bundle-Activator: org.springframework.tooling.ls.eclipse.commons.LanguageServerC Bundle-ClassPath: ., lib/remark-1.0.0.jar, lib/jsoup-1.9.2.jar +Import-Package: com.google.gson;version="2.7.0" diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/HighlightsCodeLensProvider.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/HighlightsCodeLensProvider.java index 0c21699c8..be6ba9088 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/HighlightsCodeLensProvider.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/HighlightsCodeLensProvider.java @@ -10,9 +10,13 @@ *******************************************************************************/ package org.springframework.tooling.ls.eclipse.commons; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; import org.eclipse.core.runtime.IProgressMonitor; @@ -24,14 +28,44 @@ import org.eclipse.jface.text.codemining.AbstractCodeMiningProvider; import org.eclipse.jface.text.codemining.ICodeMining; import org.eclipse.jface.text.codemining.ICodeMiningProvider; import org.eclipse.jface.text.codemining.LineHeaderCodeMining; +import org.eclipse.lsp4e.LSPEclipseUtils; import org.eclipse.lsp4e.LanguageServiceAccessor; import org.eclipse.lsp4e.LanguageServiceAccessor.LSPDocumentInfo; import org.eclipse.lsp4j.CodeLens; +import org.eclipse.lsp4j.Command; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PlatformUI; import org.springframework.tooling.ls.eclipse.commons.preferences.PreferenceConstants; +import com.google.gson.JsonPrimitive; + @SuppressWarnings("restriction") public class HighlightsCodeLensProvider extends AbstractCodeMiningProvider { + private static final Map>> ACTION_MAP = new HashMap<>(); + static { + ACTION_MAP.put("sts.open.url", (cmd) -> { + return (me) -> { + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + if (!cmd.getArguments().isEmpty() && cmd.getArguments().get(0) instanceof JsonPrimitive) { + String url = ((JsonPrimitive)cmd.getArguments().get(0)).getAsString(); + LSPEclipseUtils.open(url, page, null); + } + }; + }); + } + + private static Consumer action(Command cmd) { + if (cmd != null) { + Function> func = ACTION_MAP.get(cmd.getCommand()); + if (func != null) { + return func.apply(cmd); + } + } + return null; + } + @Override public CompletableFuture> provideCodeMinings(ITextViewer viewer, IProgressMonitor monitor) { @@ -46,7 +80,7 @@ public class HighlightsCodeLensProvider extends AbstractCodeMiningProvider { return CompletableFuture.completedFuture(highlights.getCodeLenses().stream() .filter(codeLens -> codeLens.getCommand() != null).map(codeLens -> { try { - return new HighlightCodeMining(codeLens, document, this); + return new HighlightCodeMining(codeLens, document, this, action(codeLens.getCommand())); } catch (BadLocationException e) { LanguageServerCommonsActivator.logError(e, "Failed to create Eclipse client CodeLens"); return null; @@ -60,9 +94,9 @@ public class HighlightsCodeLensProvider extends AbstractCodeMiningProvider { private static class HighlightCodeMining extends LineHeaderCodeMining { - public HighlightCodeMining(CodeLens codeLens, IDocument document, ICodeMiningProvider provider) + public HighlightCodeMining(CodeLens codeLens, IDocument document, ICodeMiningProvider provider, Consumer action) throws BadLocationException { - super(codeLens.getRange().getStart().getLine(), document, provider); + super(codeLens.getRange().getStart().getLine(), document, provider, action); setLabel(codeLens.getCommand().getTitle()); }