Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,7 @@ public void initialize(ClientCapabilities clientCap, @Nullable List<WorkspaceFol
this.workspaceFolders.addAll(currentWorkspaceFolders);
}

if (capabilities.getWorkspace() == null) {
capabilities.setWorkspace(new WorkspaceServerCapabilities());
}

var workspaceCapabilities = capabilities.getWorkspace();
var workspaceCapabilities = Nullables.ensureNonNullAndGet(capabilities, ServerCapabilities::getWorkspace, ServerCapabilities::setWorkspace, WorkspaceServerCapabilities::new);
if (Nullables.has(clientCap.getWorkspace(), WorkspaceClientCapabilities::getWorkspaceFolders)) {
var folderOptions = new WorkspaceFoldersOptions();
folderOptions.setSupported(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,17 +103,8 @@ private static FileOperationFilter extensionFilter(String ext) {
}

private static FileOperationsServerCapabilities fileOperationCapabilities(ServerCapabilities caps) {
var workspace = caps.getWorkspace();
if (workspace == null) {
workspace = new WorkspaceServerCapabilities();
caps.setWorkspace(workspace);
}
var fileOps = workspace.getFileOperations();
if (fileOps == null) {
fileOps = new FileOperationsServerCapabilities();
workspace.setFileOperations(fileOps);
}
return fileOps;
var workspace = Nullables.ensureNonNullAndGet(caps, ServerCapabilities::getWorkspace, ServerCapabilities::setWorkspace, WorkspaceServerCapabilities::new);
return Nullables.ensureNonNullAndGet(workspace, WorkspaceServerCapabilities::getFileOperations, WorkspaceServerCapabilities::setFileOperations, FileOperationsServerCapabilities::new);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import org.eclipse.lsp4j.ServerCapabilities;
import org.eclipse.lsp4j.WorkspaceClientCapabilities;
import org.eclipse.lsp4j.WorkspaceFolder;
import org.eclipse.lsp4j.WorkspaceServerCapabilities;
import org.rascalmpl.vscode.lsp.BaseWorkspaceService;
import org.rascalmpl.vscode.lsp.IBaseTextDocumentService;
import org.rascalmpl.vscode.lsp.util.Nullables;
Expand All @@ -56,10 +57,8 @@ public void initialize(ClientCapabilities clientCap, @Nullable List<WorkspaceFol
ServerCapabilities capabilities) {
super.initialize(clientCap, currentWorkspaceFolders, capabilities);

if (capabilities.getWorkspace().getFileOperations() == null) {
capabilities.getWorkspace().setFileOperations(new FileOperationsServerCapabilities());
}
var fileOperationCapabilities = capabilities.getWorkspace().getFileOperations();
var workspaceCap = Nullables.ensureNonNullAndGet(capabilities, ServerCapabilities::getWorkspace, ServerCapabilities::setWorkspace, WorkspaceServerCapabilities::new);
var fileOperationCapabilities = Nullables.ensureNonNullAndGet(workspaceCap, WorkspaceServerCapabilities::getFileOperations, WorkspaceServerCapabilities::setFileOperations, FileOperationsServerCapabilities::new);

var rascalFile = new FileOperationPattern("**/*.rsc");
rascalFile.setMatches(FileOperationPatternKind.File);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@
*/
package org.rascalmpl.vscode.lsp.util;

import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.Supplier;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.checkerframework.checker.nullness.qual.PolyNull;

Expand Down Expand Up @@ -99,4 +101,24 @@ public static <A, B> boolean has(@Nullable A a, Function<A, @Nullable B> getFunc
return get(get(a, getFunc1, null), getFunc2, defaultVal);
}

/**
* Get a value from an object. If it was not set yet (i.e. `null`), initialize and set it before returning.
* @param <C> The type of the containing object.
* @param <T> The type of the value to get.
* @param container The containing object.
* @param getter The value getter.
* @param setter The value setter. Only called if the value is not initialized yet.
* @param initializer The value initializer (e.g. a constructor). Only called if the value is not initialized yet.
* @return The gotten value, or the initialized value if was not initialized yet.
*/
public static <C, T> T ensureNonNullAndGet(C container, Function<C, @Nullable T> getter, BiConsumer<C, T> setter, Supplier<T> initializer) {
var t = getter.apply(container);
if (t == null) {
t = initializer.get();
setter.accept(container, t);
assert getter.apply(container) != null : "Setter should set same value as getter gets";
}
return t;
}

}
Loading