| 59 | } |
| 60 | |
| 61 | WorkspaceEdit parseWorkspaceEdit(const QJsonObject &editObj) |
| 62 | { |
| 63 | QJsonObject changesObj = editObj.value("changes").toObject(); |
| 64 | newlsp::WorkspaceEdit workspaceEdit; |
| 65 | if (!changesObj.isEmpty()) { |
| 66 | // std::optional<> changes; |
| 67 | newlsp::WorkspaceEdit::Changes changes; |
| 68 | for (auto fileKey : changesObj.keys()) { |
| 69 | auto addionTextEditArray = changesObj[fileKey].toArray(); |
| 70 | std::vector<newlsp::TextEdit> textEdits; |
| 71 | for (auto addion : addionTextEditArray) { |
| 72 | auto addionObj = addion.toObject(); |
| 73 | auto rangeObj = addionObj.value(lsp::K_RANGE).toObject(); |
| 74 | auto startObj = rangeObj.value(lsp::K_START).toObject(); |
| 75 | auto endObj = rangeObj.value(lsp::K_END).toObject(); |
| 76 | std::string newText = addionObj.value(lsp::K_NewText).toString().toStdString(); |
| 77 | newlsp::Position startPos { startObj.value(lsp::K_LINE).toInt(), startObj.value(lsp::K_CHARACTER).toInt() }; |
| 78 | newlsp::Position endPos { endObj.value(lsp::K_LINE).toInt(), endObj.value(lsp::K_CHARACTER).toInt() }; |
| 79 | newlsp::Range range { startPos, endPos }; |
| 80 | textEdits.push_back(newlsp::TextEdit { range, newText }); |
| 81 | } |
| 82 | changes[fileKey.toStdString()] = textEdits; |
| 83 | } |
| 84 | workspaceEdit.changes = changes; |
| 85 | } |
| 86 | |
| 87 | QJsonArray documentChangesArray = editObj.value("documentChanges").toArray(); |
| 88 | if (!documentChangesArray.isEmpty()) { |
| 89 | newlsp::WorkspaceEdit::DocumentChanges documentChanges; |
| 90 | std::vector<newlsp::TextDocumentEdit> textDocumentEdits; |
| 91 | std::vector<newlsp::CreateFile> createFiles; |
| 92 | std::vector<newlsp::RenameFile> renameFiles; |
| 93 | std::vector<newlsp::DeleteFile> deleteFiles; |
| 94 | for (auto one : documentChangesArray) { |
| 95 | QJsonObject oneObj = one.toObject(); |
| 96 | if (oneObj.contains("edits") && oneObj.contains("textDocument")) { // std::vector<newlsp::TextDocumentEdit> |
| 97 | newlsp::TextDocumentEdit textDocumentEdit; |
| 98 | |
| 99 | newlsp::OptionalVersionedTextDocumentIdentifier ovtdi; |
| 100 | QJsonObject textDocumentOneObj = oneObj.value("textDocument").toObject(); |
| 101 | ovtdi.version = textDocumentOneObj.value(lsp::K_VERSION).toInt(); |
| 102 | ovtdi.uri = textDocumentOneObj.value(lsp::K_URI).toString().toStdString(); |
| 103 | textDocumentEdit.textDocument.version = ovtdi.version; |
| 104 | textDocumentEdit.textDocument.uri = ovtdi.uri; |
| 105 | |
| 106 | std::vector<newlsp::AnnotatedTextEdit> annotatedTextEdits; |
| 107 | std::vector<newlsp::TextEdit> textEdits; |
| 108 | QJsonArray editsArray = oneObj.value("edits").toArray(); |
| 109 | for (auto editsOne : editsArray) { |
| 110 | QJsonObject editsOneObj = editsOne.toObject(); |
| 111 | QJsonObject editsOneRangeObj = editsOneObj.value("range").toObject(); |
| 112 | QJsonObject editsOneRangeStartObj = editsOneRangeObj.value(lsp::K_START).toObject(); |
| 113 | QJsonObject editsOneRangeEndObj = editsOneRangeObj.value(lsp::K_END).toObject(); |
| 114 | std::string editsOneNewText = editsOneObj.value("newText").toString().toStdString(); |
| 115 | newlsp::Range editsOneRange { |
| 116 | newlsp::Position { editsOneRangeStartObj.value(lsp::K_LINE).toInt(), editsOneRangeStartObj.value(lsp::K_CHARACTER).toInt() }, |
| 117 | newlsp::Position { editsOneRangeEndObj.value(lsp::K_LINE).toInt(), editsOneRangeEndObj.value(lsp::K_CHARACTER).toInt() } |
| 118 | }; |