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.definitions; 22 23 alias DocumentUri = string; 24 25 class Position 26 { 27 size_t line; 28 size_t character; 29 30 @safe this(size_t line = size_t.init, size_t character = size_t.init) pure nothrow 31 { 32 this.line = line; 33 this.character = character; 34 } 35 } 36 37 class Range 38 { 39 Position start; 40 Position end; 41 42 @safe this(Position start = new Position(), Position end = new Position()) pure nothrow 43 { 44 this.start = start; 45 this.end = end; 46 } 47 } 48 49 class Location 50 { 51 DocumentUri uri; 52 Range range; 53 54 @safe this(DocumentUri uri = DocumentUri.init, Range range = new Range()) pure nothrow 55 { 56 this.uri = uri; 57 this.range = range; 58 } 59 } 60 61 class LocationLink 62 { 63 import dls.util.nullable : Nullable; 64 65 Nullable!Range originSelectionRange; 66 DocumentUri targetUri; 67 Range targetRange; 68 Nullable!Range targetSelectionRange; 69 70 @safe this(Nullable!Range originSelectionRange = Nullable!Range.init, DocumentUri targetUri = DocumentUri.init, 71 Range targetRange = new Range(), 72 Nullable!Range targetSelectionRange = Nullable!Range.init) pure nothrow 73 { 74 this.originSelectionRange = originSelectionRange; 75 this.targetUri = targetUri; 76 this.targetRange = targetRange; 77 this.targetSelectionRange = targetSelectionRange; 78 } 79 } 80 81 class Diagnostic 82 { 83 import std.json : JSONValue; 84 import dls.util.nullable: Nullable; 85 86 Range range; 87 string message; 88 Nullable!DiagnosticSeverity severity; 89 Nullable!JSONValue code; 90 Nullable!string source; 91 Nullable!(DiagnosticRelatedInformation[]) relatedInformation; 92 93 @safe this(Range range = new Range(), string message = string.init, 94 Nullable!DiagnosticSeverity severity = Nullable!DiagnosticSeverity.init, 95 Nullable!JSONValue code = Nullable!JSONValue.init, 96 Nullable!string source = Nullable!string.init, 97 Nullable!(DiagnosticRelatedInformation[]) relatedInformation = Nullable!( 98 DiagnosticRelatedInformation[]).init) pure nothrow 99 { 100 this.range = range; 101 this.message = message; 102 this.severity = severity; 103 this.code = code; 104 this.source = source; 105 this.relatedInformation = relatedInformation; 106 } 107 } 108 109 enum DiagnosticSeverity : uint 110 { 111 error = 1, 112 warning = 2, 113 information = 3, 114 hint = 4 115 } 116 117 class DiagnosticRelatedInformation 118 { 119 Location location; 120 string message; 121 122 @safe this(Location location = new Location(), string message = string.init) pure nothrow 123 { 124 this.location = location; 125 this.message = message; 126 } 127 } 128 129 class Command 130 { 131 import std.json : JSONValue; 132 import dls.util.nullable: Nullable; 133 134 string title; 135 string command; 136 Nullable!(JSONValue[]) arguments; 137 138 @safe this(string title = string.init, string command = string.init, 139 Nullable!(JSONValue[]) arguments = Nullable!(JSONValue[]).init) pure nothrow 140 { 141 this.title = title; 142 this.command = command; 143 this.arguments = arguments; 144 } 145 } 146 147 class TextEdit 148 { 149 Range range; 150 string newText; 151 152 @safe this(Range range = new Range(), string newText = string.init) pure nothrow 153 { 154 this.range = range; 155 this.newText = newText; 156 } 157 } 158 159 class TextDocumentEdit 160 { 161 VersionedTextDocumentIdentifier textDocument; 162 TextEdit[] edits; 163 164 @safe this(VersionedTextDocumentIdentifier textDocument = new VersionedTextDocumentIdentifier(), 165 TextEdit[] edits = TextEdit[].init) pure nothrow 166 { 167 this.textDocument = textDocument; 168 this.edits = edits; 169 } 170 } 171 172 class CreateFileOptions 173 { 174 import dls.util.nullable: Nullable; 175 176 Nullable!bool overwrite; 177 Nullable!bool ignoreIfExists; 178 179 @safe this(Nullable!bool overwrite = Nullable!bool.init, 180 Nullable!bool ignoreIfExists = Nullable!bool.init) pure nothrow 181 { 182 this.overwrite = overwrite; 183 this.ignoreIfExists = ignoreIfExists; 184 } 185 } 186 187 class CreateFile 188 { 189 import dls.protocol.interfaces : ResourceOperationKind; 190 import dls.util.nullable: Nullable; 191 192 immutable ResourceOperationKind kind = ResourceOperationKind.create; 193 DocumentUri uri; 194 Nullable!CreateFileOptions options; 195 196 @safe this(DocumentUri uri = DocumentUri.init, 197 Nullable!CreateFileOptions options = Nullable!CreateFileOptions.init) pure nothrow 198 { 199 this.uri = uri; 200 this.options = options; 201 } 202 } 203 204 class RenameFileOptions 205 { 206 import dls.util.nullable: Nullable; 207 208 Nullable!bool overwrite; 209 Nullable!bool ignoreIfExists; 210 211 @safe this(Nullable!bool overwrite = Nullable!bool.init, 212 Nullable!bool ignoreIfExists = Nullable!bool.init) pure nothrow 213 { 214 this.overwrite = overwrite; 215 this.ignoreIfExists = ignoreIfExists; 216 } 217 } 218 219 class RenameFile 220 { 221 import dls.protocol.interfaces : ResourceOperationKind; 222 import dls.util.nullable: Nullable; 223 224 immutable ResourceOperationKind kind = ResourceOperationKind.rename; 225 DocumentUri oldUri; 226 DocumentUri newUri; 227 Nullable!RenameFileOptions options; 228 229 @safe this(DocumentUri oldUri = DocumentUri.init, DocumentUri newUri = DocumentUri.init, 230 Nullable!RenameFileOptions options = Nullable!RenameFileOptions.init) pure nothrow 231 { 232 this.oldUri = oldUri; 233 this.newUri = newUri; 234 this.options = options; 235 } 236 } 237 238 class DeleteFileOptions 239 { 240 import dls.util.nullable: Nullable; 241 242 Nullable!bool recursive; 243 Nullable!bool ignoreIfExists; 244 245 @safe this(Nullable!bool recursive = Nullable!bool.init, 246 Nullable!bool ignoreIfExists = Nullable!bool.init) pure nothrow 247 { 248 this.recursive = recursive; 249 this.ignoreIfExists = ignoreIfExists; 250 } 251 } 252 253 class DeleteFile 254 { 255 import dls.protocol.interfaces : ResourceOperationKind; 256 import dls.util.nullable: Nullable; 257 258 immutable ResourceOperationKind kind = ResourceOperationKind.delete_; 259 DocumentUri uri; 260 Nullable!DeleteFileOptions options; 261 262 @safe this(DocumentUri uri = DocumentUri.init, 263 Nullable!DeleteFileOptions options = Nullable!DeleteFileOptions.init) pure nothrow 264 { 265 this.uri = uri; 266 this.options = options; 267 } 268 } 269 270 class WorkspaceEdit 271 { 272 import dls.util.nullable: Nullable; 273 274 Nullable!(TextEdit[][string]) changes; 275 Nullable!(TextDocumentEdit[]) documentChanges; // (TextDocumentEdit | CreateFile | RenameFile | DeleteFile)[] 276 277 @safe this(Nullable!(TextEdit[][string]) changes = Nullable!(TextEdit[][string]) 278 .init, Nullable!(TextDocumentEdit[]) documentChanges = Nullable!( 279 TextDocumentEdit[]).init) pure nothrow 280 { 281 this.changes = changes; 282 this.documentChanges = documentChanges; 283 } 284 } 285 286 class TextDocumentIdentifier 287 { 288 DocumentUri uri; 289 290 @safe this(DocumentUri uri = DocumentUri.init) pure nothrow 291 { 292 this.uri = uri; 293 } 294 } 295 296 class TextDocumentItem : TextDocumentIdentifier 297 { 298 string languageId; 299 long version_; 300 string text; 301 302 @safe this(DocumentUri uri = DocumentUri.init, string languageId = string.init, 303 long version_ = long.init, string text = string.init) pure nothrow 304 { 305 super(uri); 306 this.languageId = languageId; 307 this.version_ = version_; 308 this.text = text; 309 } 310 } 311 312 class VersionedTextDocumentIdentifier : TextDocumentIdentifier 313 { 314 import std.json : JSONValue; 315 316 JSONValue version_; 317 318 @safe this(DocumentUri uri = DocumentUri.init, JSONValue version_ = JSONValue.init) pure nothrow 319 { 320 super(uri); 321 this.version_ = version_; 322 } 323 } 324 325 class TextDocumentPositionParams 326 { 327 TextDocumentIdentifier textDocument; 328 Position position; 329 330 @safe this(TextDocumentIdentifier textDocument = new TextDocumentIdentifier(), 331 Position position = new Position()) pure nothrow 332 { 333 this.textDocument = textDocument; 334 this.position = position; 335 } 336 } 337 338 class DocumentFilter 339 { 340 import dls.util.nullable: Nullable; 341 342 Nullable!string languageId; 343 Nullable!string scheme; 344 Nullable!string pattern; 345 346 @safe this(Nullable!string languageId = Nullable!string.init, 347 Nullable!string scheme = Nullable!string.init, 348 Nullable!string pattern = Nullable!string.init) pure nothrow 349 { 350 this.languageId = languageId; 351 this.scheme = scheme; 352 this.pattern = pattern; 353 } 354 } 355 356 alias DocumentSelector = DocumentFilter[]; 357 358 enum MarkupKind : string 359 { 360 plaintext = "plaintext", 361 markdown = "markdown" 362 } 363 364 class MarkupContent 365 { 366 MarkupKind kind; 367 string value; 368 369 @safe this(MarkupKind kind = MarkupKind.init, string value = string.init) pure nothrow 370 { 371 this.kind = kind; 372 this.value = value; 373 } 374 }