Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix for dynamic registration of capabilities #262

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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
8 changes: 0 additions & 8 deletions lib/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,6 @@ export async function activate(context: ExtensionContext) {
// Synchronize the setting section 'java' to the server
// NOTE: this currently doesn't do anything
configurationSection: 'java',
// Notify the server about file changes to 'javaconfig.json' files contain in the workspace
fileEvents: [
workspace.createFileSystemWatcher('**/javaconfig.json'),
workspace.createFileSystemWatcher('**/pom.xml'),
workspace.createFileSystemWatcher('**/WORKSPACE'),
workspace.createFileSystemWatcher('**/BUILD'),
workspace.createFileSystemWatcher('**/*.java')
]
},
outputChannelName: 'Java',
revealOutputChannelOn: 4 // never
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/org/javacs/JavaLanguageServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ private Set<Path> docPath() {
}
return paths;
}

private Set<String> addExports() {
if (!settings.has("addExports")) return Set.of();
var array = settings.getAsJsonArray("addExports");
Expand Down Expand Up @@ -189,7 +190,7 @@ public InitializeResult initialize(InitializeParams params) {
}

private static final String[] watchFiles = {
"**/*.java", "**/pom.xml", "**/BUILD",
"**/*.java", "**/pom.xml", "**/BUILD", "**/javaconfig.json", "**/WORKSPACE"
};

@Override
Expand Down
22 changes: 16 additions & 6 deletions src/main/java/org/javacs/lsp/LSP.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Optional;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;
Expand Down Expand Up @@ -150,11 +151,20 @@ public void showMessage(ShowMessageParams params) {
@Override
public void registerCapability(String method, JsonElement options) {
var params = new RegistrationParams();
params.id = UUID.randomUUID().toString();
params.method = method;
params.registerOptions = options;

notifyClient(send, "client/registerCapability", params);
var registration = new RegistrationParams.Registration();
registration.id = UUID.randomUUID().toString();
registration.method = method;
registration.registerOptions = options;
params.registrations.add(registration);
var jsonText = toJson(params);
var requestMethod = "client/registerCapability";
// The request should contain the id param. Otherwise, it will be considered a notification.
var id = new Random().nextInt();
var messageText =
String.format(
"{\"jsonrpc\":\"2.0\",\"id\":\"%d\",\"method\":\"%s\",\"params\":%s}",
id, requestMethod, jsonText);
writeClient(send, messageText);
}

@Override
Expand All @@ -172,7 +182,7 @@ public static void connect(
// Read messages and process cancellations on a separate thread
class MessageReader implements Runnable {
void peek(Message message) {
if (message.method.equals("$/cancelRequest")) {
if ("$/cancelRequest".equals(message.method)) {
var params = gson.fromJson(message.params, CancelParams.class);
var removed = pending.removeIf(r -> r.id != null && r.id.equals(params.id));
if (removed) LOG.info(String.format("Cancelled request %d, which had not yet started", params.id));
Expand Down
10 changes: 8 additions & 2 deletions src/main/java/org/javacs/lsp/RegistrationParams.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
package org.javacs.lsp;

import com.google.gson.JsonElement;
import java.util.ArrayList;
import java.util.List;

public class RegistrationParams {
public String id, method;
public JsonElement registerOptions;
List<Registration> registrations = new ArrayList<>();

public static class Registration {
public String id, method;
public JsonElement registerOptions;
}
}