From 3d8b4d2a6f400e330e6bbe8b8af335ecf20f56ee Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Mon, 30 Mar 2026 11:16:58 +0200 Subject: [PATCH] Use JSON segments and implicit naming. --- .../vscode/lsp/IBaseLanguageClient.java | 14 ++++---- .../lsp/IBaseLanguageServerExtensions.java | 14 ++++---- .../vscode/lsp/IRascalFileSystemServices.java | 24 +++++++------ .../lsp/parametric/LanguageRegistry.java | 6 ++-- .../uri/jsonrpc/VSCodeUriResolverClient.java | 4 ++- .../uri/jsonrpc/VSCodeUriResolverServer.java | 36 ++++++++++--------- 6 files changed, 55 insertions(+), 43 deletions(-) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/IBaseLanguageClient.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/IBaseLanguageClient.java index 5a437a739..b0ffaa2e2 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/IBaseLanguageClient.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/IBaseLanguageClient.java @@ -31,35 +31,37 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.jsonrpc.services.JsonNotification; +import org.eclipse.lsp4j.jsonrpc.services.JsonSegment; import org.eclipse.lsp4j.services.LanguageClient; import org.rascalmpl.vscode.lsp.parametric.LanguageRegistry.LanguageParameter; import io.usethesource.vallang.IInteger; import io.usethesource.vallang.IString; +@JsonSegment("rascal") public interface IBaseLanguageClient extends LanguageClient { - @JsonNotification("rascal/showContent") + @JsonNotification void showContent(URI uri, IString title, IInteger viewColumn); - @JsonNotification("rascal/receiveRegisterLanguage") + @JsonNotification void receiveRegisterLanguage(LanguageParameter lang); - @JsonNotification("rascal/receiveUnregisterLanguage") + @JsonNotification void receiveUnregisterLanguage(LanguageParameter lang); - @JsonNotification("rascal/editDocument") + @JsonNotification void editDocument(URI uri, @Nullable Range range, int viewColumn); /** * Notification sent to the vscode client to start a debugging session on the given debug adapter port */ - @JsonNotification("rascal/startDebuggingSession") + @JsonNotification void startDebuggingSession(int serverPort); /** * Notification sent to the vscode client to register the port on which the debug adapter server is listening * It is then used to make the link between a terminal process ID and the corresponding debug server port */ - @JsonNotification("rascal/registerDebugServerPort") + @JsonNotification void registerDebugServerPort(int processID, int serverPort); } diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/IBaseLanguageServerExtensions.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/IBaseLanguageServerExtensions.java index 47693efef..1f1648d0e 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/IBaseLanguageServerExtensions.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/IBaseLanguageServerExtensions.java @@ -32,35 +32,37 @@ import org.eclipse.lsp4j.jsonrpc.messages.Tuple.Two; import org.eclipse.lsp4j.jsonrpc.services.JsonNotification; import org.eclipse.lsp4j.jsonrpc.services.JsonRequest; +import org.eclipse.lsp4j.jsonrpc.services.JsonSegment; import org.eclipse.lsp4j.services.LanguageServer; import org.rascalmpl.vscode.lsp.parametric.LanguageRegistry.LanguageParameter; import org.rascalmpl.vscode.lsp.uri.jsonrpc.messages.PathConfigParameter; import org.rascalmpl.vscode.lsp.uri.jsonrpc.messages.VFSRegister; +@JsonSegment("rascal") public interface IBaseLanguageServerExtensions extends LanguageServer, IRascalFileSystemServices { - @JsonNotification("rascal/supplyRemoteIDEServicesConfiguration") + @JsonNotification default CompletableFuture supplyRemoteIDEServicesConfiguration() { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/sendRegisterLanguage") + @JsonRequest default CompletableFuture sendRegisterLanguage(LanguageParameter lang) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/sendUnregisterLanguage") + @JsonRequest default CompletableFuture sendUnregisterLanguage(LanguageParameter lang) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/supplyPathConfig") + @JsonRequest default CompletableFuture[]> supplyPathConfig(PathConfigParameter projectFolder) { throw new UnsupportedOperationException(); } - @JsonNotification("rascal/vfs/register") + @JsonNotification("vfs/register") void registerVFS(VFSRegister registration); - @JsonNotification("rascal/logLevel") + @JsonNotification("logLevel") void setMinimumLogLevel(String level); } diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/IRascalFileSystemServices.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/IRascalFileSystemServices.java index f450ed621..85b72d56f 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/IRascalFileSystemServices.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/IRascalFileSystemServices.java @@ -50,6 +50,7 @@ import org.eclipse.lsp4j.jsonrpc.messages.ResponseError; import org.eclipse.lsp4j.jsonrpc.services.JsonNotification; import org.eclipse.lsp4j.jsonrpc.services.JsonRequest; +import org.eclipse.lsp4j.jsonrpc.services.JsonSegment; import org.eclipse.lsp4j.jsonrpc.validation.NonNull; import org.rascalmpl.library.Prelude; import org.rascalmpl.uri.ISourceLocationWatcher.ISourceLocationChangeType; @@ -63,12 +64,13 @@ import io.usethesource.vallang.ISourceLocation; import io.usethesource.vallang.IValueFactory; +@JsonSegment("rascal/filesystem") public interface IRascalFileSystemServices { static final URIResolverRegistry reg = URIResolverRegistry.getInstance(); static final Logger IRascalFileSystemServices__logger = LogManager.getLogger(IRascalFileSystemServices.class); static final ExecutorService executor = NamedThreadPool.cachedDaemon("rascal-vfs"); - @JsonRequest("rascal/filesystem/resolveLocation") + @JsonRequest default CompletableFuture resolveLocation(SourceLocation loc) { return CompletableFuture.supplyAsync(() -> { try { @@ -88,7 +90,7 @@ default CompletableFuture resolveLocation(SourceLocation loc) { }, executor); } - @JsonRequest("rascal/filesystem/watch") + @JsonRequest default CompletableFuture watch(WatchParameters params) { return CompletableFuture.runAsync(() -> { try { @@ -139,7 +141,7 @@ private static boolean readonly(ISourceLocation loc) throws IOException { return true; } - @JsonRequest("rascal/filesystem/stat") + @JsonRequest default CompletableFuture stat(URIParameter uri) { return CompletableFuture.supplyAsync(() -> { try { @@ -168,7 +170,7 @@ default CompletableFuture stat(URIParameter uri) { }, executor); } - @JsonRequest("rascal/filesystem/readDirectory") + @JsonRequest default CompletableFuture readDirectory(URIParameter uri) { return CompletableFuture.supplyAsync(() -> { try { @@ -184,7 +186,7 @@ default CompletableFuture readDirectory(URIParameter uri) { }, executor); } - @JsonRequest("rascal/filesystem/createDirectory") + @JsonRequest default CompletableFuture createDirectory(URIParameter uri) { return CompletableFuture.runAsync(() -> { try { @@ -195,7 +197,7 @@ default CompletableFuture createDirectory(URIParameter uri) { }, executor); } - @JsonRequest("rascal/filesystem/readFile") + @JsonRequest default CompletableFuture readFile(URIParameter uri) { return CompletableFuture.supplyAsync(() -> { try (InputStream source = new Base64InputStream(reg.getInputStream(uri.getLocation()), true)) { @@ -206,7 +208,7 @@ default CompletableFuture readFile(URIParameter uri) { }, executor); } - @JsonRequest("rascal/filesystem/writeFile") + @JsonRequest default CompletableFuture writeFile(WriteFileParameters params) { return CompletableFuture.runAsync(() -> { try { @@ -237,7 +239,7 @@ default CompletableFuture writeFile(WriteFileParameters params) { }, executor); } - @JsonRequest("rascal/filesystem/delete") + @JsonRequest default CompletableFuture delete(DeleteParameters params) { return CompletableFuture.runAsync(() -> { try { @@ -249,7 +251,7 @@ default CompletableFuture delete(DeleteParameters params) { }, executor); } - @JsonRequest("rascal/filesystem/rename") + @JsonRequest default CompletableFuture rename(RenameParameters params) { return CompletableFuture.runAsync(() -> { try { @@ -262,7 +264,7 @@ default CompletableFuture rename(RenameParameters params) { }, executor); } - @JsonRequest("rascal/filesystem/schemes") + @JsonRequest("schemes") default CompletableFuture fileSystemSchemes() { Set inputs = reg.getRegisteredInputSchemes(); Set logicals = reg.getRegisteredLogicalSchemes(); @@ -271,7 +273,7 @@ default CompletableFuture fileSystemSchemes() { .completedFuture(Stream.concat(inputs.stream(), logicals.stream()).toArray(String[]::new)); } - @JsonNotification("rascal/filesystem/onDidChangeFile") + @JsonNotification default void onDidChangeFile(FileChangeEvent event) { } diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/LanguageRegistry.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/LanguageRegistry.java index 27720ff3b..8df1b9786 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/LanguageRegistry.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/LanguageRegistry.java @@ -33,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.eclipse.lsp4j.jsonrpc.services.JsonRequest; +import org.eclipse.lsp4j.jsonrpc.services.JsonSegment; import org.rascalmpl.values.IRascalValueFactory; import io.usethesource.vallang.IConstructor; @@ -46,11 +47,12 @@ /** * Interface of the Language Registry */ +@JsonSegment("rascal") public interface LanguageRegistry { - @JsonRequest("rascal/receiveRegisterLanguage") + @JsonRequest("receiveRegisterLanguage") CompletableFuture registerLanguage(LanguageParameter lang); - @JsonRequest("rascal/receiveUnregisterLanguage") + @JsonRequest("receiveUnregisterLanguage") CompletableFuture unregisterLanguage(LanguageParameter lang); public static class LanguageParameter { diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/uri/jsonrpc/VSCodeUriResolverClient.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/uri/jsonrpc/VSCodeUriResolverClient.java index 15b89078d..3001cf055 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/uri/jsonrpc/VSCodeUriResolverClient.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/uri/jsonrpc/VSCodeUriResolverClient.java @@ -29,13 +29,15 @@ import java.io.IOException; import java.util.function.Consumer; import org.eclipse.lsp4j.jsonrpc.services.JsonNotification; +import org.eclipse.lsp4j.jsonrpc.services.JsonSegment; import org.rascalmpl.uri.ISourceLocationWatcher; import org.rascalmpl.vscode.lsp.uri.jsonrpc.messages.ISourceLocationChanged; import io.usethesource.vallang.ISourceLocation; +@JsonSegment("rascal/vfs/watcher") public interface VSCodeUriResolverClient { - @JsonNotification("rascal/vfs/watcher/emitWatch") + @JsonNotification void emitWatch(ISourceLocationChanged event); void addWatcher(ISourceLocation loc, boolean recursive, Consumer callback, VSCodeUriResolverServer server) throws IOException; diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/uri/jsonrpc/VSCodeUriResolverServer.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/uri/jsonrpc/VSCodeUriResolverServer.java index 722d68259..005cb5d9e 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/uri/jsonrpc/VSCodeUriResolverServer.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/uri/jsonrpc/VSCodeUriResolverServer.java @@ -29,6 +29,7 @@ import java.util.concurrent.CompletableFuture; import org.eclipse.lsp4j.jsonrpc.services.JsonRequest; +import org.eclipse.lsp4j.jsonrpc.services.JsonSegment; import org.rascalmpl.vscode.lsp.uri.jsonrpc.messages.BooleanResult; import org.rascalmpl.vscode.lsp.uri.jsonrpc.messages.DirectoryListingResult; import org.rascalmpl.vscode.lsp.uri.jsonrpc.messages.FileAttributesResult; @@ -40,89 +41,90 @@ import org.rascalmpl.vscode.lsp.uri.jsonrpc.messages.WatchRequest; import org.rascalmpl.vscode.lsp.uri.jsonrpc.messages.WriteFileRequest; +@JsonSegment("rascal/vfs") public interface VSCodeUriResolverServer { - @JsonRequest("rascal/vfs/input/readFile") + @JsonRequest("input/readFile") default CompletableFuture readFile(ISourceLocationRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/input/exists") + @JsonRequest("input/exists") default CompletableFuture exists(ISourceLocationRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/input/lastModified") + @JsonRequest("input/lastModified") default CompletableFuture lastModified(ISourceLocationRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/input/created") + @JsonRequest("input/created") default CompletableFuture created(ISourceLocationRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/input/isDirectory") + @JsonRequest("input/isDirectory") default CompletableFuture isDirectory(ISourceLocationRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/input/isFile") + @JsonRequest("input/isFile") default CompletableFuture isFile(ISourceLocationRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/input/list") + @JsonRequest("input/list") default CompletableFuture list(ISourceLocationRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/input/size") + @JsonRequest("input/size") default CompletableFuture size(ISourceLocationRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/input/stat") + @JsonRequest("input/stat") default CompletableFuture stat(ISourceLocationRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/input/isReadable") + @JsonRequest("input/isReadable") default CompletableFuture isReadable(ISourceLocationRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/input/isWritable") + @JsonRequest("input/isWritable") default CompletableFuture isWritable(ISourceLocationRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/output/writeFile") + @JsonRequest("output/writeFile") default CompletableFuture writeFile(WriteFileRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/output/mkDirectory") + @JsonRequest("output/mkDirectory") default CompletableFuture mkDirectory(ISourceLocationRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/output/remove") + @JsonRequest("output/remove") default CompletableFuture remove(ISourceLocationRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/output/rename") + @JsonRequest("output/rename") default CompletableFuture rename(RenameRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/watcher/watch") + @JsonRequest("watcher/watch") default CompletableFuture watch(WatchRequest req) { throw new UnsupportedOperationException(); } - @JsonRequest("rascal/vfs/watcher/unwatch") + @JsonRequest("watcher/unwatch") default CompletableFuture unwatch(WatchRequest req) { throw new UnsupportedOperationException(); }