Skip to content

Commit 10de69f

Browse files
committed
Add initial file operation events implementation
1 parent 36ebf9f commit 10de69f

File tree

4 files changed

+152
-9
lines changed

4 files changed

+152
-9
lines changed

server/server-core/src/main/java/com/lspandimpl/server/core/BalLanguageServer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.ballerina.projects.util.ProjectConstants;
1919
import org.eclipse.lsp4j.CompletionOptions;
2020
import org.eclipse.lsp4j.DidChangeWatchedFilesRegistrationOptions;
21+
import org.eclipse.lsp4j.FileOperationsServerCapabilities;
2122
import org.eclipse.lsp4j.FileSystemWatcher;
2223
import org.eclipse.lsp4j.InitializeParams;
2324
import org.eclipse.lsp4j.InitializeResult;
@@ -105,6 +106,7 @@ public CompletableFuture<InitializeResult> initialize(InitializeParams params) {
105106

106107
// Set the workspace capabilities
107108
wsCapabilities.setWorkspaceFolders(ServerInitUtils.getWorkspaceFolderOptions());
109+
wsCapabilities.setFileOperations(ServerInitUtils.getFileOpsServerCapabilities());
108110
sCapabilities.setWorkspace(wsCapabilities);
109111

110112
return new InitializeResult(sCapabilities);

server/server-core/src/main/java/com/lspandimpl/server/core/BalWorkspaceService.java

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,17 @@
1818
import com.google.gson.Gson;
1919
import com.google.gson.JsonElement;
2020
import com.google.gson.JsonObject;
21+
import com.lspandimpl.server.api.context.BalWorkspaceContext;
22+
import com.lspandimpl.server.api.context.LSContext;
23+
import com.lspandimpl.server.core.codeaction.BalCommand;
24+
import com.lspandimpl.server.core.codeaction.CommandArgument;
25+
import com.lspandimpl.server.core.configdidchange.ConfigurationHolderImpl;
26+
import com.lspandimpl.server.core.contexts.ContextBuilder;
27+
import com.lspandimpl.server.core.executecommand.AddDocsArgs;
28+
import com.lspandimpl.server.core.executecommand.CreateVariableArgs;
29+
import com.lspandimpl.server.core.fileevents.FileOperationEventsHandler;
2130
import com.lspandimpl.server.core.utils.CommonUtils;
31+
import com.lspandimpl.server.core.wsfolderchange.WSFolderChangeHandler;
2232
import io.ballerina.compiler.api.SemanticModel;
2333
import io.ballerina.compiler.syntax.tree.DefaultableParameterNode;
2434
import io.ballerina.compiler.syntax.tree.FunctionDefinitionNode;
@@ -33,6 +43,8 @@
3343
import io.ballerina.tools.text.LinePosition;
3444
import org.eclipse.lsp4j.ApplyWorkspaceEditParams;
3545
import org.eclipse.lsp4j.ApplyWorkspaceEditResponse;
46+
import org.eclipse.lsp4j.CreateFilesParams;
47+
import org.eclipse.lsp4j.DeleteFilesParams;
3648
import org.eclipse.lsp4j.DidChangeConfigurationParams;
3749
import org.eclipse.lsp4j.DidChangeWatchedFilesParams;
3850
import org.eclipse.lsp4j.DidChangeWorkspaceFoldersParams;
@@ -41,6 +53,7 @@
4153
import org.eclipse.lsp4j.FileEvent;
4254
import org.eclipse.lsp4j.ProgressParams;
4355
import org.eclipse.lsp4j.Range;
56+
import org.eclipse.lsp4j.RenameFilesParams;
4457
import org.eclipse.lsp4j.ResourceOperation;
4558
import org.eclipse.lsp4j.SymbolInformation;
4659
import org.eclipse.lsp4j.TextDocumentEdit;
@@ -56,15 +69,6 @@
5669
import org.eclipse.lsp4j.jsonrpc.messages.Either;
5770
import org.eclipse.lsp4j.services.LanguageClient;
5871
import org.eclipse.lsp4j.services.WorkspaceService;
59-
import com.lspandimpl.server.api.context.BalWorkspaceContext;
60-
import com.lspandimpl.server.api.context.LSContext;
61-
import com.lspandimpl.server.core.codeaction.BalCommand;
62-
import com.lspandimpl.server.core.codeaction.CommandArgument;
63-
import com.lspandimpl.server.core.configdidchange.ConfigurationHolderImpl;
64-
import com.lspandimpl.server.core.contexts.ContextBuilder;
65-
import com.lspandimpl.server.core.executecommand.AddDocsArgs;
66-
import com.lspandimpl.server.core.executecommand.CreateVariableArgs;
67-
import com.lspandimpl.server.core.wsfolderchange.WSFolderChangeHandler;
6872

6973
import java.nio.file.Path;
7074
import java.util.ArrayList;
@@ -200,6 +204,36 @@ public CompletableFuture<Object> executeCommand(ExecuteCommandParams params) {
200204
});
201205
}
202206

207+
@Override
208+
public CompletableFuture<WorkspaceEdit> willCreateFiles(CreateFilesParams params) {
209+
return CompletableFuture.supplyAsync(() -> FileOperationEventsHandler.willCreate(params));
210+
}
211+
212+
@Override
213+
public void didCreateFiles(CreateFilesParams params) {
214+
FileOperationEventsHandler.didCreate(params, lsServerContext.getClient());
215+
}
216+
217+
@Override
218+
public CompletableFuture<WorkspaceEdit> willRenameFiles(RenameFilesParams params) {
219+
return CompletableFuture.supplyAsync(() -> null);
220+
}
221+
222+
@Override
223+
public void didRenameFiles(RenameFilesParams params) {
224+
225+
}
226+
227+
@Override
228+
public CompletableFuture<WorkspaceEdit> willDeleteFiles(DeleteFilesParams params) {
229+
return CompletableFuture.supplyAsync(() -> null);
230+
}
231+
232+
@Override
233+
public void didDeleteFiles(DeleteFilesParams params) {
234+
235+
}
236+
203237
private ApplyWorkspaceEditResponse
204238
applyCreateVarWorkspaceEdit(BalWorkspaceContext context,
205239
ExecuteCommandParams params) {

server/server-core/src/main/java/com/lspandimpl/server/core/ServerInitUtils.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package com.lspandimpl.server.core;
1717

18+
import io.ballerina.projects.util.ProjectConstants;
1819
import org.eclipse.lsp4j.CodeActionKind;
1920
import org.eclipse.lsp4j.CodeActionOptions;
2021
import org.eclipse.lsp4j.CodeLensOptions;
@@ -25,6 +26,10 @@
2526
import org.eclipse.lsp4j.DocumentOnTypeFormattingOptions;
2627
import org.eclipse.lsp4j.DocumentSymbolOptions;
2728
import org.eclipse.lsp4j.ExecuteCommandOptions;
29+
import org.eclipse.lsp4j.FileOperationFilter;
30+
import org.eclipse.lsp4j.FileOperationOptions;
31+
import org.eclipse.lsp4j.FileOperationPattern;
32+
import org.eclipse.lsp4j.FileOperationsServerCapabilities;
2833
import org.eclipse.lsp4j.HoverOptions;
2934
import org.eclipse.lsp4j.ImplementationRegistrationOptions;
3035
import org.eclipse.lsp4j.ReferenceOptions;
@@ -190,6 +195,24 @@ public static SignatureHelpOptions getSignatureHelpOptions() {
190195

191196
return options;
192197
}
198+
199+
public static FileOperationsServerCapabilities getFileOpsServerCapabilities() {
200+
FileOperationFilter balTomlFilter = new FileOperationFilter();
201+
FileOperationPattern balTomlPattern = new FileOperationPattern();
202+
balTomlPattern.setGlob("/**/" + ProjectConstants.BALLERINA_TOML);
203+
balTomlFilter.setPattern(balTomlPattern);
204+
balTomlFilter.setScheme("file");
205+
206+
FileOperationsServerCapabilities capabilities = new FileOperationsServerCapabilities();
207+
capabilities.setWillCreate(new FileOperationOptions(Collections.singletonList(balTomlFilter)));
208+
capabilities.setDidCreate(new FileOperationOptions(Collections.singletonList(balTomlFilter)));
209+
capabilities.setWillDelete(new FileOperationOptions(Collections.singletonList(balTomlFilter)));
210+
capabilities.setDidDelete(new FileOperationOptions(Collections.singletonList(balTomlFilter)));
211+
capabilities.setWillRename(new FileOperationOptions(Collections.singletonList(balTomlFilter)));
212+
capabilities.setDidRename(new FileOperationOptions(Collections.singletonList(balTomlFilter)));
213+
214+
return capabilities;
215+
}
193216

194217
public static HoverOptions getHoverOptions() {
195218
HoverOptions options = new HoverOptions();
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.lspandimpl.server.core.fileevents;
2+
3+
import com.lspandimpl.server.core.utils.CommonUtils;
4+
import org.eclipse.lsp4j.ApplyWorkspaceEditParams;
5+
import org.eclipse.lsp4j.CreateFile;
6+
import org.eclipse.lsp4j.CreateFileOptions;
7+
import org.eclipse.lsp4j.CreateFilesParams;
8+
import org.eclipse.lsp4j.FileCreate;
9+
import org.eclipse.lsp4j.Position;
10+
import org.eclipse.lsp4j.Range;
11+
import org.eclipse.lsp4j.ResourceOperationKind;
12+
import org.eclipse.lsp4j.TextDocumentEdit;
13+
import org.eclipse.lsp4j.TextEdit;
14+
import org.eclipse.lsp4j.VersionedTextDocumentIdentifier;
15+
import org.eclipse.lsp4j.WorkspaceEdit;
16+
import org.eclipse.lsp4j.jsonrpc.messages.Either;
17+
import org.eclipse.lsp4j.services.LanguageClient;
18+
19+
import java.util.Collections;
20+
import java.util.Optional;
21+
22+
/**
23+
* File operation events such as willCreate, didCreate, willDelete, didDelete, willRename, didRename
24+
* are handled here.
25+
* In this original implementation only the file creation events have been handled and the same concept
26+
* can be extended for the other events as well.
27+
*/
28+
public class FileOperationEventsHandler {
29+
private static final String BALLERINA_TOML = "Ballerina.toml";
30+
31+
private FileOperationEventsHandler() {
32+
}
33+
34+
public static WorkspaceEdit willCreate(CreateFilesParams params) {
35+
Optional<FileCreate> tomlCreation = params.getFiles().stream()
36+
.filter(fileCreate -> fileCreate.getUri().endsWith(BALLERINA_TOML))
37+
.findAny();
38+
if (tomlCreation.isEmpty()) {
39+
return null;
40+
}
41+
42+
CreateFile readmeOperation = new CreateFile();
43+
CreateFileOptions options = new CreateFileOptions();
44+
options.setIgnoreIfExists(true);
45+
String readmeUri = tomlCreation.get().getUri().replace(BALLERINA_TOML, "README.md");
46+
readmeOperation.setUri(readmeUri);
47+
readmeOperation.setOptions(options);
48+
readmeOperation.setKind(ResourceOperationKind.Create);
49+
50+
WorkspaceEdit wsEdit = new WorkspaceEdit();
51+
wsEdit.setDocumentChanges(Collections.singletonList(Either.forRight(readmeOperation)));
52+
53+
return wsEdit;
54+
}
55+
56+
public static void didCreate(CreateFilesParams params, LanguageClient client) {
57+
Optional<FileCreate> tomlCreation = params.getFiles().stream()
58+
.filter(fileCreate -> fileCreate.getUri().endsWith(BALLERINA_TOML))
59+
.findAny();
60+
if (tomlCreation.isEmpty()) {
61+
return;
62+
}
63+
64+
WorkspaceEdit wsEdit = new WorkspaceEdit();
65+
TextDocumentEdit defaultContent = new TextDocumentEdit();
66+
67+
TextEdit edit = new TextEdit();
68+
edit.setNewText("[build-options]"
69+
+ CommonUtils.LINE_SEPARATOR
70+
+ "observabilityIncluded = true");
71+
edit.setRange(new Range(new Position(0, 0), new Position(0, 0)));
72+
73+
VersionedTextDocumentIdentifier documentIdentifier = new VersionedTextDocumentIdentifier();
74+
documentIdentifier.setUri(tomlCreation.get().getUri());
75+
documentIdentifier.setVersion(1);
76+
77+
defaultContent.setEdits(Collections.singletonList(edit));
78+
defaultContent.setTextDocument(documentIdentifier);
79+
80+
wsEdit.setDocumentChanges(Collections.singletonList(Either.forLeft(defaultContent)));
81+
82+
client.applyEdit(new ApplyWorkspaceEditParams(wsEdit));
83+
}
84+
}

0 commit comments

Comments
 (0)