Skip to content

Commit

Permalink
Server capabilities managed better, user can disable formatting from …
Browse files Browse the repository at this point in the history
…preferences

Fixes #104

Signed-off-by: Nikolas Komonen <nikolaskomonen@gmail.com>
  • Loading branch information
NikolasKomonen authored and fbricon committed Sep 21, 2018
1 parent 79055fb commit e08053d
Show file tree
Hide file tree
Showing 15 changed files with 716 additions and 37 deletions.
28 changes: 14 additions & 14 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Debug (Attach)",
"request": "attach",
"hostName": "localhost",
"port": 1054
}
]
}
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Debug (Attach)",
"request": "attach",
"hostName": "localhost",
"port": 1054
}
]
}
1 change: 0 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
"**/.project": true,
"**/.settings": true
},
"java.saveActions.organizeImports": true,
"editor.formatOnSave": true,
"editor.renderWhitespace": "boundary",
//Use consistent indentation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,24 @@
*
* Contributors:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
* Red Hat Inc. - Dynamic Server capabilities
*/
package org.eclipse.lsp4xml;

import static org.eclipse.lsp4j.jsonrpc.CompletableFutures.computeAsync;

import java.util.Arrays;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;

import org.eclipse.lsp4j.CompletionOptions;
import org.eclipse.lsp4j.DocumentLinkOptions;
import org.eclipse.lsp4j.InitializeParams;
import org.eclipse.lsp4j.InitializeResult;
import org.eclipse.lsp4j.InitializedParams;
import org.eclipse.lsp4j.ServerCapabilities;
import org.eclipse.lsp4j.TextDocumentPositionParams;
import org.eclipse.lsp4j.TextDocumentSyncKind;
import org.eclipse.lsp4j.services.LanguageClient;
import org.eclipse.lsp4j.services.LanguageServer;
import org.eclipse.lsp4j.services.TextDocumentService;
Expand All @@ -40,6 +38,8 @@
import org.eclipse.lsp4xml.settings.LogsSettings;
import org.eclipse.lsp4xml.settings.XMLClientSettings;
import org.eclipse.lsp4xml.settings.XMLFormattingOptions;
import org.eclipse.lsp4xml.settings.capabilities.ServerCapabilitiesInitializer;
import org.eclipse.lsp4xml.settings.capabilities.XMLCapabilityManager;

/**
* XML language server.
Expand All @@ -55,6 +55,7 @@ public class XMLLanguageServer implements LanguageServer, ProcessLanguageServer,
private LanguageClient languageClient;
private final ScheduledExecutorService delayer;
private Integer parentProcessId;
public XMLCapabilityManager capabilityManager;

public XMLLanguageServer() {
xmlLanguageService = new XMLLanguageService();
Expand All @@ -66,24 +67,30 @@ public XMLLanguageServer() {
@Override
public CompletableFuture<InitializeResult> initialize(InitializeParams params) {
LOGGER.info("Initializing LSP4XML server");
updateSettings(InitializationOptionsSettings.getSettings(params));
xmlTextDocumentService.updateClientCapabilities(params.getCapabilities());
this.parentProcessId = params.getProcessId();
ServerCapabilities capabilities = new ServerCapabilities();
capabilities
.setTextDocumentSync(xmlTextDocumentService.isIncrementalSupport() ? TextDocumentSyncKind.Incremental
: TextDocumentSyncKind.Full);
capabilities.setDocumentSymbolProvider(true);
capabilities.setDocumentHighlightProvider(true);
capabilities.setCompletionProvider(new CompletionOptions(false, Arrays.asList(".", ":", "<", "\"", "=", "/")));
capabilities.setDocumentFormattingProvider(true);
capabilities.setDocumentRangeFormattingProvider(true);
capabilities.setHoverProvider(true);
capabilities.setRenameProvider(true);
capabilities.setFoldingRangeProvider(true);
capabilities.setDocumentLinkProvider(new DocumentLinkOptions(true));
capabilities.setCodeActionProvider(true);
return CompletableFuture.completedFuture(new InitializeResult(capabilities));

capabilityManager.setClientCapabilities(params.getCapabilities());
updateSettings(InitializationOptionsSettings.getSettings(params));

xmlTextDocumentService.updateClientCapabilities(capabilityManager.getClientCapabilities().capabilities);
ServerCapabilities nonDynamicServerCapabilities = ServerCapabilitiesInitializer.getNonDynamicServerCapabilities(
capabilityManager.getClientCapabilities(), xmlTextDocumentService.isIncrementalSupport());

return CompletableFuture.completedFuture(new InitializeResult(nonDynamicServerCapabilities));
}

/*
* Registers all capabilities that do not support client side preferences to
* turn on/off
*
* (non-Javadoc)
*
* @see org.eclipse.lsp4j.services.LanguageServer#initialized(org.eclipse.lsp4j.
* InitializedParams)
*/
@Override
public void initialized(InitializedParams params) {
capabilityManager.initializeCapabilities();
}

/**
Expand All @@ -96,6 +103,7 @@ public void updateSettings(Object initializationOptionsSettings) {
return;
}
// Update client settings

XMLClientSettings clientSettings = XMLClientSettings.getSettings(initializationOptionsSettings);
if (clientSettings != null) {
// Update logs settings
Expand Down Expand Up @@ -143,6 +151,7 @@ public WorkspaceService getWorkspaceService() {

public void setClient(LanguageClient languageClient) {
this.languageClient = languageClient;
capabilityManager = new XMLCapabilityManager(this.languageClient, xmlTextDocumentService);
}

public LanguageClient getLanguageClient() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
import org.eclipse.lsp4xml.services.XMLLanguageService;
import org.eclipse.lsp4xml.services.extensions.CompletionSettings;
import org.eclipse.lsp4xml.settings.XMLExperimentalCapabilities;
import org.eclipse.lsp4xml.settings.capabilities.ClientCapabilitiesWrapper;
import org.eclipse.lsp4xml.settings.XMLFormattingOptions;
import org.eclipse.lsp4xml.utils.JSONUtility;

Expand Down Expand Up @@ -329,4 +330,8 @@ public boolean isIncrementalSupport() {
return documents.isIncremental();
}

public XMLFormattingOptions getSharedFormattingOptions() {
return this.sharedFormattingOptions;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public CompletableFuture<List<? extends SymbolInformation>> symbol(WorkspaceSymb
@Override
public void didChangeConfiguration(DidChangeConfigurationParams params) {
xmlLanguageServer.updateSettings(params.getSettings());
xmlLanguageServer.capabilityManager.syncDynamicCapabilitiesWithPreferences();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ public static Range toLSPRange(XMLLocator location, XMLSchemaErrorCode code, Obj
}
return XMLPositionUtility.selectText(offset, document);*/
}
default:
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ public XMLDocument parse(TextDocument document) {
curr.addChild(textNode);
break;
}

default:
}
token = scanner.scan();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,9 @@ public CompletionList doComplete(XMLDocument xmlDocument, Position position, Com
case WithinContent:
collectInsideContent(completionRequest, completionResponse);
return completionResponse;
default:
}

}
break;
case EndTagOpen:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ public List<FoldingRange> getFoldingRanges(TextDocument document, FoldingRangeCa
}
break;
}
default:
}
token = scanner.scan();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public class XMLFormattingOptions extends FormattingOptions {
private static final String FORMAT_COMMENTS = "formatComments";
private static final String JOIN_COMMENT_LINES = "joinCommentLines";
private static final String JOIN_CONTENT_LINES = "joinContentLines";
private static final String ENABLED = "enabled";

public XMLFormattingOptions() {
this(false);
Expand All @@ -43,6 +44,7 @@ private void initializeDefaultSettings() {
this.setFormatComments(true);
this.setJoinCommentLines(false);
this.setJoinContentLines(false);
this.setEnabled(true);
}

public XMLFormattingOptions(int tabSize, boolean insertSpaces) {
Expand Down Expand Up @@ -118,6 +120,19 @@ public void setJoinContentLines(final boolean joinContentLines) {
this.putBoolean(XMLFormattingOptions.JOIN_CONTENT_LINES, Boolean.valueOf(joinContentLines));
}

public boolean isEnabled() {
final Boolean value = this.getBoolean(XMLFormattingOptions.ENABLED);
if ((value != null)) {
return (value).booleanValue();
} else {
return false;
}
}

public void setEnabled(final boolean enabled) {
this.putBoolean(XMLFormattingOptions.ENABLED, Boolean.valueOf(enabled));
}

public XMLFormattingOptions merge(FormattingOptions formattingOptions) {
formattingOptions.entrySet().stream().forEach(entry -> //
this.putIfAbsent(entry.getKey(), entry.getValue()) //
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/**
* Copyright (c) 2018 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 v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat Inc. - initial API and implementation
*/

package org.eclipse.lsp4xml.settings.capabilities;

import org.eclipse.lsp4j.ClientCapabilities;
import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
import org.eclipse.lsp4j.TextDocumentClientCapabilities;

/**
* Determines if a client supports a specific capability dynamically
*/
public class ClientCapabilitiesWrapper {
private boolean v3Supported;

public ClientCapabilities capabilities;

public ClientCapabilitiesWrapper() {
this.capabilities = new ClientCapabilities();
this.v3Supported = false;
}
public ClientCapabilitiesWrapper(ClientCapabilities capabilities) {
this.capabilities = capabilities;
this.v3Supported = capabilities != null ? capabilities.getTextDocument() != null : false;
}

/**
* IMPORTANT
*
* This should be up to date with all Server supported capabilities
*
*/

public boolean isCompletionDynamicRegistrationSupported() {
return v3Supported && isDynamicRegistrationSupported(getTextDocument().getCompletion());
}

public boolean isLinkDynamicRegistrationSupported() {
return v3Supported && isDynamicRegistrationSupported(getTextDocument().getDocumentLink());
}

public boolean isRangeFoldingDynamicRegistrationSupported() {
return v3Supported && isDynamicRegistrationSupported(getTextDocument().getFoldingRange());
}

public boolean isDocumentSyncDynamicRegistrationSupported() {
return v3Supported && isDynamicRegistrationSupported(getTextDocument().getSynchronization());
}

public boolean isFormattingDynamicRegistrationSupported() {
return v3Supported && isDynamicRegistrationSupported(getTextDocument().getFormatting());
}

public boolean isRangeFormattingDynamicRegistrationSupported() {
return v3Supported && isDynamicRegistrationSupported(getTextDocument().getRangeFormatting());
}

public boolean isRenameDynamicRegistrationSupported() {
return v3Supported && isDynamicRegistrationSupported(getTextDocument().getRename());
}

public boolean isDocumentSymbolDynamicRegistered() {
return v3Supported && isDynamicRegistrationSupported(getTextDocument().getDocumentSymbol());
}

public boolean isCodeActionDynamicRegistered() {
return v3Supported && isDynamicRegistrationSupported(getTextDocument().getCodeAction());
}

public boolean isHoverDynamicRegistered() {
return v3Supported && isDynamicRegistrationSupported(getTextDocument().getHover());
}

public boolean isDocumentHighlightDynamicRegistered() {
return v3Supported && isDynamicRegistrationSupported(getTextDocument().getDocumentHighlight());
}

private boolean isDynamicRegistrationSupported(DynamicRegistrationCapabilities capability) {
return capability != null && capability.getDynamicRegistration().booleanValue();
}

public TextDocumentClientCapabilities getTextDocument() {
return this.capabilities.getTextDocument();
}

}
Loading

0 comments on commit e08053d

Please sign in to comment.