From eaae1da1cff22d077c456ed352ad2e00d6e6ffd0 Mon Sep 17 00:00:00 2001 From: Victor Rubezhny Date: Fri, 2 Jun 2023 17:21:56 +0200 Subject: [PATCH] Fix API incompatobilities in latest o.e.lsp4e (v. >= 0.17) --- .../META-INF/MANIFEST.MF | 2 +- .../tests/TestTypeScript.java | 25 ++++++++++---- .../feature.xml | 2 +- .../pom.xml | 2 +- .../META-INF/MANIFEST.MF | 4 +-- org.eclipse.wildwebdeveloper.xml/pom.xml | 2 +- .../xml/internal/XMLLanguageServer.java | 13 +++---- .../xml/internal/XmlLanguageClientImpl.java | 16 ++++++++- .../commands/AssociateGrammarHandler.java | 34 +++++++++++-------- .../META-INF/MANIFEST.MF | 2 +- .../json/JSonLanguageServer.java | 12 +++---- ...treamConnectionProviderWithPreference.java | 13 +++---- 12 files changed, 80 insertions(+), 47 deletions(-) diff --git a/org.eclipse.wildwebdeveloper.tests/META-INF/MANIFEST.MF b/org.eclipse.wildwebdeveloper.tests/META-INF/MANIFEST.MF index fcaf50b975..8b298d6359 100644 --- a/org.eclipse.wildwebdeveloper.tests/META-INF/MANIFEST.MF +++ b/org.eclipse.wildwebdeveloper.tests/META-INF/MANIFEST.MF @@ -15,7 +15,7 @@ Require-Bundle: org.eclipse.wildwebdeveloper;bundle-version="1.0.0", org.eclipse.jface.text, org.eclipse.ui.tests.harness, org.eclipse.ui, - org.eclipse.lsp4e, + org.eclipse.lsp4e;bundle-version="0.16.0", org.eclipse.wildwebdeveloper.xml;bundle-version="0.1.0", org.eclipse.wildwebdeveloper.embedder.node;bundle-version="0.2.0", org.eclipse.lsp4j;bundle-version="0.9.0", diff --git a/org.eclipse.wildwebdeveloper.tests/src/org/eclipse/wildwebdeveloper/tests/TestTypeScript.java b/org.eclipse.wildwebdeveloper.tests/src/org/eclipse/wildwebdeveloper/tests/TestTypeScript.java index fb51154c15..19e1e43744 100644 --- a/org.eclipse.wildwebdeveloper.tests/src/org/eclipse/wildwebdeveloper/tests/TestTypeScript.java +++ b/org.eclipse.wildwebdeveloper.tests/src/org/eclipse/wildwebdeveloper/tests/TestTypeScript.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019 Red Hat Inc. and others. + * Copyright (c) 2019, 2023 Red Hat Inc. and others. * * This program and the accompanying materials are made * available under the terms of the Eclipse Public License 2.0 @@ -12,18 +12,26 @@ *******************************************************************************/ package org.eclipse.wildwebdeveloper.tests; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; + import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jface.text.IDocument; import org.eclipse.lsp4e.LSPEclipseUtils; -import org.eclipse.lsp4e.LanguageServiceAccessor; +import org.eclipse.lsp4e.LanguageServers; import org.eclipse.lsp4j.Hover; import org.eclipse.lsp4j.HoverParams; import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.ServerCapabilities; import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.eclipse.lsp4j.services.LanguageServer; import org.eclipse.ui.IViewReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; @@ -61,11 +69,14 @@ public void testHTMLinTSXFile() throws Exception { // didChange HoverParams params = new HoverParams(new TextDocumentIdentifier(LSPEclipseUtils.toUri(document).toString()), new Position(0, 18)); - Hover hover = LanguageServiceAccessor - .getLanguageServers(document, - capability -> LSPEclipseUtils.hasCapability(capability.getHoverProvider())) - .get().get(0).getTextDocumentService().hover(params).get(); + + List languageServers = new ArrayList<>(); + LanguageServers.forDocument(document).withCapability(ServerCapabilities::getHoverProvider) + .collectAll((w, ls) -> CompletableFuture.completedFuture(ls)).thenAccept(languageServers::addAll) + .get(500, TimeUnit.MILLISECONDS); + assertFalse(languageServers.isEmpty()); + + Hover hover = languageServers.get(0).getTextDocumentService().hover(params).get(); assertTrue(hover.getContents().toString().contains("button")); } - } diff --git a/org.eclipse.wildwebdeveloper.xml.feature/feature.xml b/org.eclipse.wildwebdeveloper.xml.feature/feature.xml index b6d59fa07d..76477fa7ba 100644 --- a/org.eclipse.wildwebdeveloper.xml.feature/feature.xml +++ b/org.eclipse.wildwebdeveloper.xml.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.wildwebdeveloper.xml.feature/pom.xml b/org.eclipse.wildwebdeveloper.xml.feature/pom.xml index fde8616d07..2b9fa3f080 100644 --- a/org.eclipse.wildwebdeveloper.xml.feature/pom.xml +++ b/org.eclipse.wildwebdeveloper.xml.feature/pom.xml @@ -7,7 +7,7 @@ 1.0.0-SNAPSHOT eclipse-feature - 1.1.0-SNAPSHOT + 1.1.1-SNAPSHOT diff --git a/org.eclipse.wildwebdeveloper.xml/META-INF/MANIFEST.MF b/org.eclipse.wildwebdeveloper.xml/META-INF/MANIFEST.MF index e1860650b1..fa0c25613b 100644 --- a/org.eclipse.wildwebdeveloper.xml/META-INF/MANIFEST.MF +++ b/org.eclipse.wildwebdeveloper.xml/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.wildwebdeveloper.xml;singleton:=true -Bundle-Version: 1.1.0.qualifier +Bundle-Version: 1.1.1.qualifier Bundle-Vendor: %providerName Bundle-Localization: plugin Automatic-Module-Name: org.eclipse.wildwebdeveloper.xml @@ -10,7 +10,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-17 Require-Bundle: org.eclipse.tm4e.registry;bundle-version="0.3.0", org.eclipse.tm4e.ui;bundle-version="0.1.0", org.eclipse.tm4e.languageconfiguration;bundle-version="0.1.0", - org.eclipse.lsp4e;bundle-version="0.13.4", + org.eclipse.lsp4e;bundle-version="0.16.0", org.eclipse.lsp4j;bundle-version="0.9.0", org.eclipse.core.filesystem;bundle-version="1.7.0", org.eclipse.core.resources;bundle-version="3.12.0", diff --git a/org.eclipse.wildwebdeveloper.xml/pom.xml b/org.eclipse.wildwebdeveloper.xml/pom.xml index ae1223e0db..9bc3ac5948 100644 --- a/org.eclipse.wildwebdeveloper.xml/pom.xml +++ b/org.eclipse.wildwebdeveloper.xml/pom.xml @@ -7,7 +7,7 @@ 1.0.0-SNAPSHOT eclipse-plugin - 1.1.0-SNAPSHOT + 1.1.1-SNAPSHOT diff --git a/org.eclipse.wildwebdeveloper.xml/src/org/eclipse/wildwebdeveloper/xml/internal/XMLLanguageServer.java b/org.eclipse.wildwebdeveloper.xml/src/org/eclipse/wildwebdeveloper/xml/internal/XMLLanguageServer.java index a66dc2c2a6..085a7b583e 100644 --- a/org.eclipse.wildwebdeveloper.xml/src/org/eclipse/wildwebdeveloper/xml/internal/XMLLanguageServer.java +++ b/org.eclipse.wildwebdeveloper.xml/src/org/eclipse/wildwebdeveloper/xml/internal/XMLLanguageServer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2021 Red Hat Inc. and others. + * Copyright (c) 2019, 2023 Red Hat Inc. and others. * * This program and the accompanying materials are made * available under the terms of the Eclipse Public License 2.0 @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import org.eclipse.core.net.proxy.IProxyData; @@ -36,9 +37,9 @@ import org.eclipse.core.runtime.Status; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.lsp4e.LanguageServers; import org.eclipse.lsp4e.LanguageServersRegistry; import org.eclipse.lsp4e.LanguageServersRegistry.LanguageServerDefinition; -import org.eclipse.lsp4e.LanguageServiceAccessor; import org.eclipse.lsp4e.server.ProcessStreamConnectionProvider; import org.eclipse.lsp4j.DidChangeConfigurationParams; import org.eclipse.wildwebdeveloper.xml.internal.ui.preferences.XMLPreferenceServerConstants; @@ -77,10 +78,10 @@ private static enum CodeLensKind { @SuppressWarnings("rawtypes") DidChangeConfigurationParams params = new DidChangeConfigurationParams( Collections.singletonMap(XML_KEY, ((Map) config.get(SETTINGS_KEY)).get(XML_KEY))); - LanguageServiceAccessor.getActiveLanguageServers(null).stream() - .filter(server -> lemminxDefinition - .equals(LanguageServiceAccessor.resolveServerDefinition(server).get())) - .forEach(ls -> ls.getWorkspaceService().didChangeConfiguration(params)); + + LanguageServers.forProject(null).withPreferredServer(lemminxDefinition).excludeInactive() + .collectAll((w, ls) -> CompletableFuture.completedFuture(ls)).thenAccept( + lss -> lss.stream().forEach(ls -> ls.getWorkspaceService().didChangeConfiguration(params))); }); }; diff --git a/org.eclipse.wildwebdeveloper.xml/src/org/eclipse/wildwebdeveloper/xml/internal/XmlLanguageClientImpl.java b/org.eclipse.wildwebdeveloper.xml/src/org/eclipse/wildwebdeveloper/xml/internal/XmlLanguageClientImpl.java index 9745c29ef6..c101654ead 100644 --- a/org.eclipse.wildwebdeveloper.xml/src/org/eclipse/wildwebdeveloper/xml/internal/XmlLanguageClientImpl.java +++ b/org.eclipse.wildwebdeveloper.xml/src/org/eclipse/wildwebdeveloper/xml/internal/XmlLanguageClientImpl.java @@ -1,7 +1,20 @@ +/******************************************************************************* + * Copyright (c) 2020, 2923 Red Hat Inc. and others. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Alex Boyko - initial implementation + *******************************************************************************/ package org.eclipse.wildwebdeveloper.xml.internal; import java.util.concurrent.CompletableFuture; +import org.eclipse.jface.text.IDocument; import org.eclipse.lsp4e.LanguageClientImpl; import org.eclipse.lsp4e.command.CommandExecutor; import org.eclipse.lsp4j.Command; @@ -10,11 +23,12 @@ @SuppressWarnings("restriction") public class XmlLanguageClientImpl extends LanguageClientImpl implements XMLLanguageClient{ + @Override public CompletableFuture executeClientCommand(ExecuteCommandParams params) { Command cmd = new Command(); cmd.setCommand(params.getCommand()); cmd.setArguments(params.getArguments()); - return CommandExecutor.executeCommand(cmd, null, null); + return CommandExecutor.executeCommandClientSide(cmd, (IDocument)null); } } diff --git a/org.eclipse.wildwebdeveloper.xml/src/org/eclipse/wildwebdeveloper/xml/internal/commands/AssociateGrammarHandler.java b/org.eclipse.wildwebdeveloper.xml/src/org/eclipse/wildwebdeveloper/xml/internal/commands/AssociateGrammarHandler.java index e5dcde1d30..c71fd3cd64 100644 --- a/org.eclipse.wildwebdeveloper.xml/src/org/eclipse/wildwebdeveloper/xml/internal/commands/AssociateGrammarHandler.java +++ b/org.eclipse.wildwebdeveloper.xml/src/org/eclipse/wildwebdeveloper/xml/internal/commands/AssociateGrammarHandler.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2022 Red Hat Inc. and others. + * Copyright (c) 2022 2023 Red Hat Inc. and others. * This program and the accompanying materials are made * available under the terms of the Eclipse Public License 2.0 * which is available at https://www.eclipse.org/legal/epl-2.0/ @@ -15,6 +15,7 @@ import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; import java.util.function.Predicate; import org.eclipse.core.commands.ExecutionEvent; @@ -22,7 +23,7 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.lsp4e.LSPEclipseUtils; -import org.eclipse.lsp4e.LanguageServiceAccessor; +import org.eclipse.lsp4e.LanguageServers; import org.eclipse.lsp4e.command.LSPCommandHandler; import org.eclipse.lsp4j.Command; import org.eclipse.lsp4j.ExecuteCommandOptions; @@ -87,22 +88,28 @@ public Object execute(ExecutionEvent event, Command command, IPath path) throws } private static CompletableFuture executeServerCommand(String commandId, Object... params) throws Exception { - List commandHandlers = LanguageServiceAccessor - .getActiveLanguageServers(handlesCommand(commandId)); - if (commandHandlers != null) { - if (commandHandlers.size() == 1) { - LanguageServer handler = commandHandlers.get(0); - return handler.getWorkspaceService() - .executeCommand(new ExecuteCommandParams(commandId, Arrays.asList(params))); - } else if (commandHandlers.size() > 1) { - throw new IllegalStateException( - "Multiple language servers have registered to handle command '" + commandId + "'"); - } + List commandHandlers = new ArrayList<>(); + LanguageServers.forProject(null).withCapability(serverCapabilities -> { + ExecuteCommandOptions executeCommandProvider = serverCapabilities.getExecuteCommandProvider(); + return Either.forLeft(executeCommandProvider != null ? + executeCommandProvider.getCommands().contains(commandId) : false); + }).excludeInactive().collectAll((w, ls) -> CompletableFuture.completedFuture(ls)) + .thenAccept(commandHandlers::addAll).get(100, TimeUnit.MILLISECONDS); + + if (commandHandlers.size() == 1) { + LanguageServer handler = commandHandlers.get(0); + return handler.getWorkspaceService() + .executeCommand(new ExecuteCommandParams(commandId, Arrays.asList(params))); + } else if (commandHandlers.size() > 1) { + throw new IllegalStateException( + "Multiple language servers have registered to handle command '" + commandId + "'"); } + throw new UnsupportedOperationException( "No language server has registered to handle command '" + commandId + "'"); } + // TODO: not used - a subject to remove private static Predicate handlesCommand(String commandId) { return (serverCaps) -> { ExecuteCommandOptions executeCommandProvider = serverCaps.getExecuteCommandProvider(); @@ -112,5 +119,4 @@ private static Predicate handlesCommand(String commandId) { return false; }; } - } diff --git a/org.eclipse.wildwebdeveloper/META-INF/MANIFEST.MF b/org.eclipse.wildwebdeveloper/META-INF/MANIFEST.MF index c96a1994bb..67bee3c6cc 100644 --- a/org.eclipse.wildwebdeveloper/META-INF/MANIFEST.MF +++ b/org.eclipse.wildwebdeveloper/META-INF/MANIFEST.MF @@ -9,7 +9,7 @@ Bundle-Version: 1.0.8.qualifier Bundle-Activator: org.eclipse.wildwebdeveloper.Activator Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, - org.eclipse.lsp4e;bundle-version="0.13.6", + org.eclipse.lsp4e;bundle-version="0.16.0", org.eclipse.lsp4j.jsonrpc;bundle-version="0.12.0", org.eclipse.lsp4j;bundle-version="0.12.0", org.eclipse.tm4e.registry;bundle-version="0.1.0", diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/json/JSonLanguageServer.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/json/JSonLanguageServer.java index 56d0b71729..f5a4f2975f 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/json/JSonLanguageServer.java +++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/json/JSonLanguageServer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2016 Rogue Wave Software Inc. and others. + * Copyright (c) 2016, 2023 Rogue Wave Software Inc. and others. * * This program and the accompanying materials are made * available under the terms of the Eclipse Public License 2.0 @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IConfigurationElement; @@ -34,9 +35,9 @@ import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.lsp4e.LanguageServers; import org.eclipse.lsp4e.LanguageServersRegistry; import org.eclipse.lsp4e.LanguageServersRegistry.LanguageServerDefinition; -import org.eclipse.lsp4e.LanguageServiceAccessor; import org.eclipse.lsp4e.server.ProcessStreamConnectionProvider; import org.eclipse.lsp4j.InitializeResult; import org.eclipse.lsp4j.jsonrpc.messages.Message; @@ -66,10 +67,9 @@ public void propertyChange(PropertyChangeEvent event) { if (SchemaAssociationsPreferenceInitializer.SCHEMA_ASSOCIATIONS_PREFERENCE.equals(event.getProperty())) { Map> associations = getSchemaAssociations(); - LanguageServiceAccessor.getActiveLanguageServers(null).stream() - .filter(server -> JSON_LS_DEFINITION - .equals(LanguageServiceAccessor.resolveServerDefinition(server).get())) - .forEach(ls -> ((JSonLanguageServerInterface) ls).sendJSonchemaAssociations(associations)); + LanguageServers.forProject(null).withPreferredServer(JSON_LS_DEFINITION).excludeInactive() + .collectAll((w, ls) -> CompletableFuture.completedFuture(ls)).thenAccept( + lss -> lss.stream().forEach(ls -> ((JSonLanguageServerInterface) ls).sendJSonchemaAssociations(associations))); } } }; diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/ui/preferences/ProcessStreamConnectionProviderWithPreference.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/ui/preferences/ProcessStreamConnectionProviderWithPreference.java index cc1692797c..b0240621a8 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/ui/preferences/ProcessStreamConnectionProviderWithPreference.java +++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/ui/preferences/ProcessStreamConnectionProviderWithPreference.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2022 Red Hat Inc. and others. + * Copyright (c) 2022, 2023 Red Hat Inc. and others. * * This program and the accompanying materials are made * available under the terms of the Eclipse Public License 2.0 @@ -18,13 +18,14 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; +import java.util.concurrent.CompletableFuture; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.lsp4e.LanguageServers; import org.eclipse.lsp4e.LanguageServersRegistry; import org.eclipse.lsp4e.LanguageServersRegistry.LanguageServerDefinition; -import org.eclipse.lsp4e.LanguageServiceAccessor; import org.eclipse.lsp4e.server.ProcessStreamConnectionProvider; import org.eclipse.lsp4j.DidChangeConfigurationParams; import org.eclipse.lsp4j.services.WorkspaceService; @@ -160,10 +161,10 @@ public void propertyChange(PropertyChangeEvent event) { LanguageServerDefinition languageServerDefinition = getLanguageServerDefinition(); @SuppressWarnings("rawtypes") DidChangeConfigurationParams params = new DidChangeConfigurationParams(createSettings()); - LanguageServiceAccessor.getActiveLanguageServers(null).stream() - .filter(server -> languageServerDefinition - .equals(LanguageServiceAccessor.resolveServerDefinition(server).get())) - .forEach(ls -> ls.getWorkspaceService().didChangeConfiguration(params)); + + LanguageServers.forProject(null).withPreferredServer(languageServerDefinition).excludeInactive() + .collectAll((w, ls) -> CompletableFuture.completedFuture(ls)).thenAccept( + lss -> lss.stream().forEach(ls -> ls.getWorkspaceService().didChangeConfiguration(params))); } }