diff --git a/lsp/org.eclipse.cdt.lsp.core.tests/src/org/eclipse/cdt/lsp/core/tests/cquery/CqueryJsonParseTest.java b/lsp/org.eclipse.cdt.lsp.core.tests/src/org/eclipse/cdt/lsp/core/tests/cquery/CqueryJsonParseTest.java index d2b6f84172f..419dc47c937 100644 --- a/lsp/org.eclipse.cdt.lsp.core.tests/src/org/eclipse/cdt/lsp/core/tests/cquery/CqueryJsonParseTest.java +++ b/lsp/org.eclipse.cdt.lsp.core.tests/src/org/eclipse/cdt/lsp/core/tests/cquery/CqueryJsonParseTest.java @@ -23,7 +23,7 @@ import org.eclipse.cdt.cquery.HighlightSymbol; import org.eclipse.cdt.cquery.IndexingProgressStats; import org.eclipse.cdt.cquery.StorageClass; import org.eclipse.cdt.cquery.SymbolRole; -import org.eclipse.cdt.lsp.core.Server2ClientProtocolExtension; +import org.eclipse.cdt.internal.cquery.ui.CqueryProtocolExtension; import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod; @@ -34,7 +34,7 @@ import org.junit.Assert; import org.junit.Test; public class CqueryJsonParseTest { - Map methods = ServiceEndpoints.getSupportedMethods(Server2ClientProtocolExtension.class); + Map methods = ServiceEndpoints.getSupportedMethods(CqueryProtocolExtension.class); private MessageJsonHandler jsonHandler = new MessageJsonHandler(methods); private void assertParse(final String json, final NotificationMessage expectedResult) { diff --git a/lsp/org.eclipse.cdt.lsp.core/META-INF/MANIFEST.MF b/lsp/org.eclipse.cdt.lsp.core/META-INF/MANIFEST.MF index 1f10dcf4912..fef4fd1b8d5 100644 --- a/lsp/org.eclipse.cdt.lsp.core/META-INF/MANIFEST.MF +++ b/lsp/org.eclipse.cdt.lsp.core/META-INF/MANIFEST.MF @@ -36,4 +36,5 @@ Bundle-ActivationPolicy: lazy Service-Component: OSGI-INF/org.eclipse.cdt.lsp.internal.core.ContributedLanguageServers.xml, OSGI-INF/org.eclipse.cdt.internal.clangd.ClangdLanguageServer.xml, OSGI-INF/org.eclipse.cdt.internal.cquery.CqueryLanguageServer.xml, - OSGI-INF/org.eclipse.cdt.lsp.internal.core.ContributedProtocolExtensions.xml + OSGI-INF/org.eclipse.cdt.lsp.internal.core.ContributedProtocolExtensions.xml, + OSGI-INF/org.eclipse.cdt.internal.cquery.ui.CqueryProtocolExtension.xml diff --git a/lsp/org.eclipse.cdt.lsp.core/OSGI-INF/org.eclipse.cdt.internal.cquery.ui.CqueryProtocolExtension.xml b/lsp/org.eclipse.cdt.lsp.core/OSGI-INF/org.eclipse.cdt.internal.cquery.ui.CqueryProtocolExtension.xml new file mode 100644 index 00000000000..516262d86ad --- /dev/null +++ b/lsp/org.eclipse.cdt.lsp.core/OSGI-INF/org.eclipse.cdt.internal.cquery.ui.CqueryProtocolExtension.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/lsp/org.eclipse.cdt.lsp.core/plugin.xml b/lsp/org.eclipse.cdt.lsp.core/plugin.xml index b2c54a7e4f2..42c4a970155 100644 --- a/lsp/org.eclipse.cdt.lsp.core/plugin.xml +++ b/lsp/org.eclipse.cdt.lsp.core/plugin.xml @@ -30,7 +30,7 @@ class="org.eclipse.cdt.lsp.core.CPPStreamConnectionProvider" id="org.eclipse.cdt.lsp.core" label="%server.label" - clientImpl="org.eclipse.cdt.lsp.core.Server2ClientProtocolExtension" > + launcherBuilder="org.eclipse.cdt.lsp.internal.core.DelegatingLauncherBuilder"> CqueryMessages.CqueryLanguageServer_label, new StatusLineMessage()); this.inactive = new SetInactiveRegions(); this.highlighting = new PublishSemanticHighlighting(); } + @Override + public String targetIdentifier() { + return "cquery"; //$NON-NLS-1$ + } + @JsonNotification("$cquery/progress") public final void indexingProgress(IndexingProgressStats stats) { progress.accept(stats::getTotalJobs); diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/DelegatingLauncherBuilder.java b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/DelegatingLauncherBuilder.java new file mode 100644 index 00000000000..0a155a41ccd --- /dev/null +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/DelegatingLauncherBuilder.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Alexander Fedorov (ArSysOp) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.lsp.internal.core; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.cdt.lsp.LanguageProtocolExtension; +import org.eclipse.cdt.lsp.SupportedProtocolExtensions; +import org.eclipse.core.runtime.ServiceCaller; +import org.eclipse.lsp4e.LanguageClientImpl; +import org.eclipse.lsp4j.jsonrpc.Launcher; +import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod; +import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints; + +@SuppressWarnings("restriction") +public final class DelegatingLauncherBuilder extends Launcher.Builder { + + private final ResolvePreferredServer server; + + public DelegatingLauncherBuilder() { + this.server = new ResolvePreferredServer(); + } + + @Override + protected Map getSupportedMethods() { + Map methods = new LinkedHashMap<>(super.getSupportedMethods()); + extensions().stream()// + .map(x -> x.getClass())// + .map(ServiceEndpoints::getSupportedMethods)// + .forEach(methods::putAll); + return methods; + } + + private List extensions() { + List extensions = new ArrayList<>(); + ServiceCaller.callOnce(getClass(), SupportedProtocolExtensions.class, + x -> extensions.addAll(x.applicable(server.apply(getClass())))); + return extensions; + } + +}