From 75d2586f9523f406d234231af4f077ca2530ee90 Mon Sep 17 00:00:00 2001 From: azerr Date: Wed, 1 Jul 2020 18:50:34 +0200 Subject: [PATCH] vscode-quarkus should not be a Java formatter Fixes https://github.com/redhat-developer/vscode-quarkus/issues/166 Signed-off-by: azerr --- ...MicroProfileRegistrationConfiguration.java | 29 +++++++ .../MicroProfileCapabilityManager.java | 86 +++++++++++++++++-- .../ServerCapabilitiesConstants.java | 5 +- .../QuarkusRegistrationConfiguration.java | 46 ++++++++++ ...ies.IMicroProfileRegistrationConfiguration | 1 + 5 files changed, 156 insertions(+), 11 deletions(-) create mode 100644 microprofile.ls/com.redhat.microprofile.ls/src/main/java/com/redhat/microprofile/settings/capabilities/IMicroProfileRegistrationConfiguration.java create mode 100644 quarkus.ls.ext/com.redhat.quarkus.ls/src/main/java/com/redhat/quarkus/settings/capabilities/QuarkusRegistrationConfiguration.java create mode 100644 quarkus.ls.ext/com.redhat.quarkus.ls/src/main/resources/META-INF/services/com.redhat.microprofile.settings.capabilities.IMicroProfileRegistrationConfiguration diff --git a/microprofile.ls/com.redhat.microprofile.ls/src/main/java/com/redhat/microprofile/settings/capabilities/IMicroProfileRegistrationConfiguration.java b/microprofile.ls/com.redhat.microprofile.ls/src/main/java/com/redhat/microprofile/settings/capabilities/IMicroProfileRegistrationConfiguration.java new file mode 100644 index 000000000..55eac59f0 --- /dev/null +++ b/microprofile.ls/com.redhat.microprofile.ls/src/main/java/com/redhat/microprofile/settings/capabilities/IMicroProfileRegistrationConfiguration.java @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2019-2020 Red Hat, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat Inc. - initial API and implementation + */ +package com.redhat.microprofile.settings.capabilities; + +import org.eclipse.lsp4j.Registration; + +/** + * LSP Registration configuration API. + * + */ +public interface IMicroProfileRegistrationConfiguration { + + /** + * Configure the given LSP registration. + * + * @param registration the registration to configure. + */ + public void configure(Registration registration); +} diff --git a/microprofile.ls/com.redhat.microprofile.ls/src/main/java/com/redhat/microprofile/settings/capabilities/MicroProfileCapabilityManager.java b/microprofile.ls/com.redhat.microprofile.ls/src/main/java/com/redhat/microprofile/settings/capabilities/MicroProfileCapabilityManager.java index de4aaf9d8..1b2aa606f 100644 --- a/microprofile.ls/com.redhat.microprofile.ls/src/main/java/com/redhat/microprofile/settings/capabilities/MicroProfileCapabilityManager.java +++ b/microprofile.ls/com.redhat.microprofile.ls/src/main/java/com/redhat/microprofile/settings/capabilities/MicroProfileCapabilityManager.java @@ -1,10 +1,15 @@ -/******************************************************************************* - * Copyright (c) 2019 Red Hat Inc. and others. All rights reserved. This program - * and the accompanying materials which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v20.html +/** + * Copyright (c) 2019-2020 Red Hat, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 * - * Contributors: Red Hat Inc. - initial API and implementation - *******************************************************************************/ + * Contributors: + * Red Hat Inc. - initial API and implementation + */ package com.redhat.microprofile.settings.capabilities; import static com.redhat.microprofile.settings.capabilities.ServerCapabilitiesConstants.CODE_ACTION_ID; @@ -25,13 +30,19 @@ import static com.redhat.microprofile.settings.capabilities.ServerCapabilitiesConstants.TEXT_DOCUMENT_HOVER; import static com.redhat.microprofile.settings.capabilities.ServerCapabilitiesConstants.TEXT_DOCUMENT_RANGE_FORMATTING; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; +import java.util.List; +import java.util.ServiceLoader; import java.util.Set; import org.eclipse.lsp4j.ClientCapabilities; +import org.eclipse.lsp4j.DocumentFilter; import org.eclipse.lsp4j.Registration; import org.eclipse.lsp4j.RegistrationParams; +import org.eclipse.lsp4j.TextDocumentRegistrationOptions; import org.eclipse.lsp4j.services.LanguageClient; import com.redhat.microprofile.ls.commons.client.ExtendedClientCapabilities; @@ -45,9 +56,14 @@ public class MicroProfileCapabilityManager { private final LanguageClient languageClient; private ClientCapabilitiesWrapper clientWrapper; + private TextDocumentRegistrationOptions formattingRegistrationOptions; + + private final List registrationConfigurations; + private boolean registrationConfigurationsInitialized; public MicroProfileCapabilityManager(LanguageClient languageClient) { this.languageClient = languageClient; + this.registrationConfigurations = new ArrayList<>(); } /** @@ -74,14 +90,39 @@ public void initializeCapabilities() { registerCapability(DEFINITION_ID, TEXT_DOCUMENT_DEFINITION); } if (this.getClientCapabilities().isFormattingDynamicRegistered()) { - registerCapability(FORMATTING_ID, TEXT_DOCUMENT_FORMATTING); + // The MP language server manages properties and Java files, but for formatting + // and range formatting + // feature, only properties file are supported. + // We need to inform to the client that only properties are supported for format + // feature with register options: + /** + *
+			 * "registerOptions": {
+			 *  "documentSelector": [
+			 *      { "language": "microprofile-properties" },
+			 *      { "language": "quarkus-properties" }
+			 *  ]
+			 * }
+			 * 
+ */ + registerCapability(FORMATTING_ID, TEXT_DOCUMENT_FORMATTING, getFormattingRegistrationOptions()); } if (this.getClientCapabilities().isFormattingDynamicRegistered()) { - registerCapability(RANGE_FORMATTING_ID, TEXT_DOCUMENT_RANGE_FORMATTING); + registerCapability(RANGE_FORMATTING_ID, TEXT_DOCUMENT_RANGE_FORMATTING, getFormattingRegistrationOptions()); + } + } + + private TextDocumentRegistrationOptions getFormattingRegistrationOptions() { + if (formattingRegistrationOptions == null) { + formattingRegistrationOptions = new TextDocumentRegistrationOptions( + new ArrayList<>(Arrays.asList(new DocumentFilter("microprofile-properties", null, null)))); + } + return formattingRegistrationOptions; } - public void setClientCapabilities(ClientCapabilities clientCapabilities, ExtendedClientCapabilities extendedClientCapabilities) { + public void setClientCapabilities(ClientCapabilities clientCapabilities, + ExtendedClientCapabilities extendedClientCapabilities) { this.clientWrapper = new ClientCapabilitiesWrapper(clientCapabilities, extendedClientCapabilities); } @@ -104,8 +145,35 @@ private void registerCapability(String id, String method, Object options) { if (registeredCapabilities.add(id)) { Registration registration = new Registration(id, method, options); RegistrationParams registrationParams = new RegistrationParams(Collections.singletonList(registration)); + getRegistrationConfigurations().forEach(config -> { + config.configure(registration); + }); languageClient.registerCapability(registrationParams); } } + /** + * Returns list of registration configuration contributed with Java SPI. + * + * @return list of registration configuration contributed with Java SPI. + */ + private List getRegistrationConfigurations() { + if (!registrationConfigurationsInitialized) { + initializeRegistrationConfigurations(); + } + return registrationConfigurations; + } + + private synchronized void initializeRegistrationConfigurations() { + if (registrationConfigurationsInitialized) { + return; + } + ServiceLoader extensions = ServiceLoader + .load(IMicroProfileRegistrationConfiguration.class); + extensions.forEach(extension -> { + this.registrationConfigurations.add(extension); + }); + registrationConfigurationsInitialized = true; + } + } \ No newline at end of file diff --git a/microprofile.ls/com.redhat.microprofile.ls/src/main/java/com/redhat/microprofile/settings/capabilities/ServerCapabilitiesConstants.java b/microprofile.ls/com.redhat.microprofile.ls/src/main/java/com/redhat/microprofile/settings/capabilities/ServerCapabilitiesConstants.java index eb785d06f..ef6aef8ec 100644 --- a/microprofile.ls/com.redhat.microprofile.ls/src/main/java/com/redhat/microprofile/settings/capabilities/ServerCapabilitiesConstants.java +++ b/microprofile.ls/com.redhat.microprofile.ls/src/main/java/com/redhat/microprofile/settings/capabilities/ServerCapabilitiesConstants.java @@ -44,8 +44,9 @@ private ServerCapabilitiesConstants() { public static final String CODE_ACTION_ID = UUID.randomUUID().toString(); public static final String CODE_LENS_ID = UUID.randomUUID().toString(); - public static final CompletionOptions DEFAULT_COMPLETION_OPTIONS = new CompletionOptions(false, Arrays.asList(".", - "%", "=" /* triggered characters for properties file */ , "@" /* triggered characters for java snippets annotation */)); + public static final CompletionOptions DEFAULT_COMPLETION_OPTIONS = new CompletionOptions(false, + Arrays.asList(".", "%", "=" /* triggered characters for properties file */ , + "@" /* triggered characters for java snippets annotation */)); public static final CodeLensOptions DEFAULT_CODELENS_OPTIONS = new CodeLensOptions(); } \ No newline at end of file diff --git a/quarkus.ls.ext/com.redhat.quarkus.ls/src/main/java/com/redhat/quarkus/settings/capabilities/QuarkusRegistrationConfiguration.java b/quarkus.ls.ext/com.redhat.quarkus.ls/src/main/java/com/redhat/quarkus/settings/capabilities/QuarkusRegistrationConfiguration.java new file mode 100644 index 000000000..3a88743c1 --- /dev/null +++ b/quarkus.ls.ext/com.redhat.quarkus.ls/src/main/java/com/redhat/quarkus/settings/capabilities/QuarkusRegistrationConfiguration.java @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2019-2020 Red Hat, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat Inc. - initial API and implementation + */ +package com.redhat.quarkus.settings.capabilities; + +import static com.redhat.microprofile.settings.capabilities.ServerCapabilitiesConstants.TEXT_DOCUMENT_FORMATTING; +import static com.redhat.microprofile.settings.capabilities.ServerCapabilitiesConstants.TEXT_DOCUMENT_RANGE_FORMATTING; + +import org.eclipse.lsp4j.DocumentFilter; +import org.eclipse.lsp4j.Registration; +import org.eclipse.lsp4j.TextDocumentRegistrationOptions; + +import com.redhat.microprofile.settings.capabilities.IMicroProfileRegistrationConfiguration; + +/** + * Specific Quarkus LSP Registration configuration + * + */ +public class QuarkusRegistrationConfiguration implements IMicroProfileRegistrationConfiguration { + + @Override + public void configure(Registration registration) { + switch (registration.getMethod()) { + case TEXT_DOCUMENT_FORMATTING: + case TEXT_DOCUMENT_RANGE_FORMATTING: + // add "quarkus-properties" as language document filter for formatting + ((TextDocumentRegistrationOptions) registration.getRegisterOptions()).getDocumentSelector() + .add(new DocumentFilter("quarkus-properties", null, null)); + break; + default: + break; + + } + + } + +} diff --git a/quarkus.ls.ext/com.redhat.quarkus.ls/src/main/resources/META-INF/services/com.redhat.microprofile.settings.capabilities.IMicroProfileRegistrationConfiguration b/quarkus.ls.ext/com.redhat.quarkus.ls/src/main/resources/META-INF/services/com.redhat.microprofile.settings.capabilities.IMicroProfileRegistrationConfiguration new file mode 100644 index 000000000..4b65fd4e1 --- /dev/null +++ b/quarkus.ls.ext/com.redhat.quarkus.ls/src/main/resources/META-INF/services/com.redhat.microprofile.settings.capabilities.IMicroProfileRegistrationConfiguration @@ -0,0 +1 @@ +com.redhat.quarkus.settings.capabilities.QuarkusRegistrationConfiguration \ No newline at end of file