1 module dls.protocol.messages.text_document;
2 
3 import dls.protocol.definitions;
4 import dls.protocol.interfaces.text_document;
5 import dls.protocol.jsonrpc : send;
6 import dls.tools.tools : Tools;
7 import dls.util.document : Document;
8 import dls.util.logger : logger;
9 import dls.util.uri : Uri;
10 import std.typecons : Nullable;
11 
12 void didOpen(DidOpenTextDocumentParams params)
13 {
14     if (params.textDocument.languageId == "d")
15     {
16         auto uri = new Uri(params.textDocument.uri);
17         logger.infof("Document opened: %s", uri.path);
18         Document.open(params.textDocument);
19         send("textDocument/publishDiagnostics",
20                 new PublishDiagnosticsParams(uri, Tools.analysisTool.scan(uri)));
21     }
22 }
23 
24 void didChange(DidChangeTextDocumentParams params)
25 {
26     auto uri = new Uri(params.textDocument.uri);
27     logger.infof("Document changed: %s", uri.path);
28     Document.change(params.textDocument, params.contentChanges);
29 }
30 
31 void willSave(WillSaveTextDocumentParams params)
32 {
33 }
34 
35 TextEdit[] willSaveWaitUntil(WillSaveTextDocumentParams params)
36 {
37     return [];
38 }
39 
40 void didSave(DidSaveTextDocumentParams params)
41 {
42     auto uri = new Uri(params.textDocument.uri);
43 
44     if (Document[uri])
45     {
46         logger.infof("Document saved: %s", uri.path);
47         send("textDocument/publishDiagnostics",
48                 new PublishDiagnosticsParams(uri, Tools.analysisTool.scan(uri)));
49     }
50 }
51 
52 void didClose(DidCloseTextDocumentParams params)
53 {
54     auto uri = new Uri(params.textDocument.uri);
55     logger.infof("Document closed: %s", uri.path);
56     Document.close(params.textDocument);
57     send("textDocument/publishDiagnostics", new PublishDiagnosticsParams(uri, []));
58 }
59 
60 CompletionItem[] completion(CompletionParams params)
61 {
62     return Tools.symbolTool.completion(new Uri(params.textDocument.uri), params.position);
63 }
64 
65 @("completionItem", "resolve")
66 CompletionItem completionItem_resolve(CompletionItem item)
67 {
68     return Tools.symbolTool.completionResolve(item);
69 }
70 
71 Hover hover(TextDocumentPositionParams params)
72 {
73     return Tools.symbolTool.hover(new Uri(params.textDocument.uri), params.position);
74 }
75 
76 SignatureHelp signatureHelp(TextDocumentPositionParams params)
77 {
78     return null;
79 }
80 
81 Location definition(TextDocumentPositionParams params)
82 {
83     return Tools.symbolTool.definition(new Uri(params.textDocument.uri), params.position);
84 }
85 
86 Nullable!Location typeDefinition(TextDocumentPositionParams params)
87 {
88     return Nullable!Location();
89 }
90 
91 Nullable!Location implementation(TextDocumentPositionParams params)
92 {
93     return Nullable!Location();
94 }
95 
96 Location[] references(ReferenceParams params)
97 {
98     return [];
99 }
100 
101 DocumentHighlight[] documentHighlight(TextDocumentPositionParams params)
102 {
103     return Tools.symbolTool.highlight(new Uri(params.textDocument.uri), params.position);
104 }
105 
106 SymbolInformation[] documentSymbol(DocumentSymbolParams params)
107 {
108     return Tools.symbolTool.symbol("", new Uri(params.textDocument.uri));
109 }
110 
111 Command[] codeAction(CodeActionParams params)
112 {
113     return [];
114 }
115 
116 CodeLens[] codeLens(CodeLensParams params)
117 {
118     return [];
119 }
120 
121 @("codeLens", "resolve")
122 CodeLens codeLens_resolve(CodeLens codeLens)
123 {
124     return codeLens;
125 }
126 
127 DocumentLink[] documentLink(DocumentLinkParams params)
128 {
129     return [];
130 }
131 
132 @("documentLink", "resolve")
133 DocumentLink documentLink_resolve(DocumentLink link)
134 {
135     return link;
136 }
137 
138 ColorInformation[] documentColor(DocumentColorParams params)
139 {
140     return [];
141 }
142 
143 ColorPresentation[] colorPresentation(ColorPresentationParams params)
144 {
145     return [];
146 }
147 
148 TextEdit[] formatting(DocumentFormattingParams params)
149 {
150     auto uri = new Uri(params.textDocument.uri);
151     logger.infof("Formatting %s", uri.path);
152     return Tools.formatTool.formatting(uri, params.options);
153 }
154 
155 TextEdit[] rangeFormatting(DocumentRangeFormattingParams params)
156 {
157     return [];
158 }
159 
160 TextEdit[] onTypeFormatting(DocumentOnTypeFormattingParams params)
161 {
162     return [];
163 }
164 
165 WorkspaceEdit[] rename(RenameParams params)
166 {
167     return [];
168 }