1 module dls.protocol.messages.workspace;
2 
3 import dls.protocol.interfaces : SymbolInformation;
4 import dls.protocol.interfaces.workspace;
5 import dls.tools.tools : Tools;
6 import dls.util.logger : logger;
7 import dls.util.uri : Uri;
8 import std.json : JSONValue;
9 import std.typecons : Nullable;
10 
11 void workspaceFolders(string id, Nullable!(WorkspaceFolder[]) folders)
12 {
13     if (!folders.isNull)
14     {
15         foreach (workspaceFolder; folders)
16         {
17             auto uri = new Uri(workspaceFolder.uri);
18             Tools.symbolTool.importPath(uri);
19             Tools.symbolTool.importSelections(uri);
20             Tools.analysisTool.addAnalysisConfigPath(uri);
21         }
22     }
23 }
24 
25 void didChangeWorkspaceFolders(DidChangeWorkspaceFoldersParams params)
26 {
27     import std.typecons : nullable;
28 
29     workspaceFolders(null, params.event.added.nullable);
30 
31     foreach (folder; params.event.removed)
32     {
33         auto uri = new Uri(folder.uri);
34         Tools.symbolTool.clearPath(uri);
35         Tools.analysisTool.removeAnalysisConfigPath(uri);
36     }
37 }
38 
39 void configuration(string id, JSONValue[] config)
40 {
41 }
42 
43 void didChangeConfiguration(DidChangeConfigurationParams params)
44 {
45     import dls.tools.configuration : Configuration;
46     import dls.util.json : convertFromJSON;
47 
48     logger.info("Configuration changed");
49 
50     if ("d" in params.settings && "dls" in params.settings["d"])
51     {
52         logger.info("Applying new configuration");
53         Tools.setConfiguration(convertFromJSON!Configuration(params.settings["d"]["dls"]));
54     }
55 }
56 
57 void didChangeWatchedFiles(DidChangeWatchedFilesParams params)
58 {
59     import dls.protocol.interfaces : MessageActionItem, MessageType,
60         ShowMessageRequestParams;
61     import dls.protocol.messages.window : Util;
62     import std.algorithm : canFind;
63     import std.path : baseName, dirName;
64 
65     foreach (event; params.changes)
66     {
67         auto uri = new Uri(event.uri);
68         const fileName = baseName(uri.path);
69 
70         logger.infof("File changed: %s", uri.path);
71 
72         switch (fileName)
73         {
74         case "dub.json", "dub.sdl":
75             auto id = Util.sendMessageRequest(
76                     Util.ShowMessageRequestType.upgradeSelections, [uri.path]);
77             Util.addMessageRequestType(id, Util.ShowMessageRequestType.upgradeSelections, uri);
78             break;
79 
80         case "dub.selections.json":
81             Tools.symbolTool.importSelections(uri);
82             break;
83 
84         default:
85             Tools.analysisTool.updateAnalysisConfigPath(Uri.fromPath(uri.path.dirName));
86             break;
87         }
88     }
89 }
90 
91 SymbolInformation[] symbol(WorkspaceSymbolParams params)
92 {
93     return Tools.symbolTool.symbol(params.query);
94 }
95 
96 JSONValue executeCommand(ExecuteCommandParams params)
97 {
98     return JSONValue(null);
99 }
100 
101 void applyEdit(string id, ApplyWorkspaceEditResponse response)
102 {
103 }