1 /*
2  *Copyright (C) 2018 Laurent Tréguier
3  *
4  *This file is part of DLS.
5  *
6  *DLS is free software: you can redistribute it and/or modify
7  *it under the terms of the GNU General Public License as published by
8  *the Free Software Foundation, either version 3 of the License, or
9  *(at your option) any later version.
10  *
11  *DLS is distributed in the hope that it will be useful,
12  *but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *GNU General Public License for more details.
15  *
16  *You should have received a copy of the GNU General Public License
17  *along with DLS.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20 
21 module dls.protocol.messages.text_document;
22 
23 import dls.protocol.definitions;
24 import dls.protocol.interfaces.text_document;
25 import std.json : JSONValue;
26 import std.typecons : Nullable;
27 
28 void didOpen(DidOpenTextDocumentParams params)
29 {
30     import dls.protocol.jsonrpc : send;
31     import dls.protocol.messages.methods : TextDocument;
32     import dls.tools.analysis_tool : AnalysisTool;
33     import dls.util.document : Document;
34     import dls.util.logger : logger;
35     import dls.util.uri : Uri;
36 
37     if (params.textDocument.languageId == "d")
38     {
39         auto uri = new Uri(params.textDocument.uri);
40         logger.infof("Document opened: %s", uri.path);
41         Document.open(params.textDocument);
42         send(TextDocument.publishDiagnostics, new PublishDiagnosticsParams(uri,
43                 AnalysisTool.instance.scan(uri)));
44     }
45 }
46 
47 void didChange(DidChangeTextDocumentParams params)
48 {
49     import dls.util.document : Document;
50     import dls.util.logger : logger;
51     import dls.util.uri : Uri;
52 
53     auto uri = new Uri(params.textDocument.uri);
54     logger.infof("Document changed: %s", uri.path);
55     Document.change(params.textDocument, params.contentChanges);
56 }
57 
58 void willSave(WillSaveTextDocumentParams params)
59 {
60 }
61 
62 TextEdit[] willSaveWaitUntil(WillSaveTextDocumentParams params)
63 {
64     return [];
65 }
66 
67 void didSave(DidSaveTextDocumentParams params)
68 {
69     import dls.protocol.jsonrpc : send;
70     import dls.protocol.messages.methods : TextDocument;
71     import dls.tools.analysis_tool : AnalysisTool;
72     import dls.util.document : Document;
73     import dls.util.logger : logger;
74     import dls.util.uri : Uri;
75 
76     auto uri = new Uri(params.textDocument.uri);
77     logger.infof("Document saved: %s", uri.path);
78     send(TextDocument.publishDiagnostics, new PublishDiagnosticsParams(uri,
79             AnalysisTool.instance.scan(uri)));
80 }
81 
82 void didClose(DidCloseTextDocumentParams params)
83 {
84     import dls.protocol.jsonrpc : send;
85     import dls.protocol.messages.methods : TextDocument;
86     import dls.util.document : Document;
87     import dls.util.logger : logger;
88     import dls.util.uri : Uri;
89 
90     auto uri = new Uri(params.textDocument.uri);
91     logger.infof("Document closed: %s", uri.path);
92     Document.close(params.textDocument);
93     send(TextDocument.publishDiagnostics, new PublishDiagnosticsParams(uri, []));
94 }
95 
96 CompletionItem[] completion(CompletionParams params)
97 {
98     import dls.tools.symbol_tool : SymbolTool;
99     import dls.util.uri : Uri;
100 
101     return SymbolTool.instance.completion(new Uri(params.textDocument.uri), params.position);
102 }
103 
104 @("completionItem", "resolve")
105 CompletionItem completionItem_resolve(CompletionItem item)
106 {
107     import dls.tools.symbol_tool : SymbolTool;
108 
109     return SymbolTool.instance.completionResolve(item);
110 }
111 
112 Hover hover(TextDocumentPositionParams params)
113 {
114     import dls.tools.symbol_tool : SymbolTool;
115     import dls.util.uri : Uri;
116 
117     return SymbolTool.instance.hover(new Uri(params.textDocument.uri), params.position);
118 }
119 
120 SignatureHelp signatureHelp(TextDocumentPositionParams params)
121 {
122     return null;
123 }
124 
125 Location[] definition(TextDocumentPositionParams params)
126 {
127     import dls.tools.symbol_tool : SymbolTool;
128     import dls.util.uri : Uri;
129 
130     return SymbolTool.instance.definition(new Uri(params.textDocument.uri), params.position);
131 }
132 
133 Location[] typeDefinition(TextDocumentPositionParams params)
134 {
135     import dls.tools.symbol_tool : SymbolTool;
136     import dls.util.uri : Uri;
137 
138     return SymbolTool.instance.typeDefinition(new Uri(params.textDocument.uri), params.position);
139 }
140 
141 Location implementation(TextDocumentPositionParams params)
142 {
143     return null;
144 }
145 
146 Location[] references(ReferenceParams params)
147 {
148     import dls.tools.symbol_tool : SymbolTool;
149     import dls.util.uri : Uri;
150 
151     return SymbolTool.instance.references(new Uri(params.textDocument.uri),
152             params.position, params.context.includeDeclaration);
153 }
154 
155 DocumentHighlight[] documentHighlight(TextDocumentPositionParams params)
156 {
157     import dls.tools.symbol_tool : SymbolTool;
158     import dls.util.uri : Uri;
159 
160     return SymbolTool.instance.highlight(new Uri(params.textDocument.uri), params.position);
161 }
162 
163 JSONValue documentSymbol(DocumentSymbolParams params)
164 {
165     import dls.protocol.state : initState;
166     import dls.tools.symbol_tool : SymbolTool;
167     import dls.util.json : convertToJSON;
168     import dls.util.uri : Uri;
169 
170     auto uri = new Uri(params.textDocument.uri);
171 
172     if (!initState.capabilities.textDocument.isNull && !initState.capabilities.textDocument.documentSymbol.isNull
173             && !initState.capabilities.textDocument.documentSymbol.hierarchicalDocumentSymbolSupport.isNull
174             && initState.capabilities.textDocument.documentSymbol.hierarchicalDocumentSymbolSupport)
175     {
176         return convertToJSON(SymbolTool.instance.symbol!DocumentSymbol(uri, null));
177     }
178     else
179     {
180         return convertToJSON(SymbolTool.instance.symbol!SymbolInformation(uri, null));
181     }
182 }
183 
184 CodeAction[] codeAction(CodeActionParams params)
185 {
186     return [];
187 }
188 
189 CodeLens[] codeLens(CodeLensParams params)
190 {
191     return [];
192 }
193 
194 @("codeLens", "resolve")
195 CodeLens codeLens_resolve(CodeLens codeLens)
196 {
197     return codeLens;
198 }
199 
200 DocumentLink[] documentLink(DocumentLinkParams params)
201 {
202     return [];
203 }
204 
205 @("documentLink", "resolve")
206 DocumentLink documentLink_resolve(DocumentLink link)
207 {
208     return link;
209 }
210 
211 ColorInformation[] documentColor(DocumentColorParams params)
212 {
213     return [];
214 }
215 
216 ColorPresentation[] colorPresentation(ColorPresentationParams params)
217 {
218     return [];
219 }
220 
221 TextEdit[] formatting(DocumentFormattingParams params)
222 {
223     import dls.tools.format_tool : FormatTool;
224     import dls.util.uri : Uri;
225 
226     auto uri = new Uri(params.textDocument.uri);
227     return FormatTool.instance.formatting(uri, params.options);
228 }
229 
230 TextEdit[] rangeFormatting(DocumentRangeFormattingParams params)
231 {
232     return [];
233 }
234 
235 TextEdit[] onTypeFormatting(DocumentOnTypeFormattingParams params)
236 {
237     return [];
238 }
239 
240 WorkspaceEdit rename(RenameParams params)
241 {
242     import dls.tools.symbol_tool : SymbolTool;
243     import dls.util.uri : Uri;
244 
245     return SymbolTool.instance.rename(new Uri(params.textDocument.uri),
246             params.position, params.newName);
247 }
248 
249 Range prepareRename(TextDocumentPositionParams params)
250 {
251     import dls.tools.symbol_tool : SymbolTool;
252     import dls.util.uri : Uri;
253 
254     return SymbolTool.instance.prepareRename(new Uri(params.textDocument.uri), params.position);
255 }
256 
257 FoldingRange[] foldingRange(FoldingRangeParams params)
258 {
259     return [];
260 }