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 }