Skip to content

Commit

Permalink
vscode-quarkus should not be a Java formatter
Browse files Browse the repository at this point in the history
Fixes redhat-developer/vscode-quarkus#166

Signed-off-by: azerr <azerr@redhat.com>
  • Loading branch information
angelozerr committed Jul 3, 2020
1 parent 475d3a1 commit 75d2586
Show file tree
Hide file tree
Showing 5 changed files with 156 additions and 11 deletions.
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -45,9 +56,14 @@ public class MicroProfileCapabilityManager {
private final LanguageClient languageClient;

private ClientCapabilitiesWrapper clientWrapper;
private TextDocumentRegistrationOptions formattingRegistrationOptions;

private final List<IMicroProfileRegistrationConfiguration> registrationConfigurations;
private boolean registrationConfigurationsInitialized;

public MicroProfileCapabilityManager(LanguageClient languageClient) {
this.languageClient = languageClient;
this.registrationConfigurations = new ArrayList<>();
}

/**
Expand All @@ -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:
/**
* <pre>
* "registerOptions": {
* "documentSelector": [
* { "language": "microprofile-properties" },
* { "language": "quarkus-properties" }
* ]
* }
* </pre>
*/
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);
}

Expand All @@ -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<IMicroProfileRegistrationConfiguration> getRegistrationConfigurations() {
if (!registrationConfigurationsInitialized) {
initializeRegistrationConfigurations();
}
return registrationConfigurations;
}

private synchronized void initializeRegistrationConfigurations() {
if (registrationConfigurationsInitialized) {
return;
}
ServiceLoader<IMicroProfileRegistrationConfiguration> extensions = ServiceLoader
.load(IMicroProfileRegistrationConfiguration.class);
extensions.forEach(extension -> {
this.registrationConfigurations.add(extension);
});
registrationConfigurationsInitialized = true;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Original file line number Diff line number Diff line change
@@ -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;

}

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
com.redhat.quarkus.settings.capabilities.QuarkusRegistrationConfiguration

0 comments on commit 75d2586

Please sign in to comment.