diff --git a/src/libs/languageserverprotocol/jsonkeys.h b/src/libs/languageserverprotocol/jsonkeys.h index 4a3cfcc55f7..535e58359e3 100644 --- a/src/libs/languageserverprotocol/jsonkeys.h +++ b/src/libs/languageserverprotocol/jsonkeys.h @@ -43,6 +43,7 @@ constexpr char changeKey[] = "change"; constexpr char changeNotificationsKey[] = "changeNotifications"; constexpr char changesKey[] = "changes"; constexpr char characterKey[] = "character"; +constexpr char childrenKey[] = "children"; constexpr char codeActionKey[] = "codeAction"; constexpr char codeActionProviderKey[] = "codeActionProvider"; constexpr char codeKey[] = "code"; @@ -73,6 +74,7 @@ constexpr char dataKey[] = "data"; constexpr char defaultCharset[] = "utf-8"; constexpr char definitionKey[] = "definition"; constexpr char definitionProviderKey[] = "definitionProvider"; +constexpr char deprecatedKey[] = "deprecated"; constexpr char detailKey[] = "detail"; constexpr char diagnosticsKey[] = "diagnostics"; constexpr char didChangeConfigurationKey[] = "didChangeConfiguration"; @@ -160,6 +162,7 @@ constexpr char saveKey[] = "save"; constexpr char schemeKey[] = "scheme"; constexpr char scopeUriKey[] = "scopeUri"; constexpr char sectionKey[] = "section"; +constexpr char selectionRangeKey[] = "selectionRange"; constexpr char settingsKey[] = "settings"; constexpr char severityKey[] = "severity"; constexpr char signatureHelpKey[] = "signatureHelp"; diff --git a/src/libs/languageserverprotocol/languagefeatures.cpp b/src/libs/languageserverprotocol/languagefeatures.cpp index 8009ed1ebd4..bcff1385c05 100644 --- a/src/libs/languageserverprotocol/languagefeatures.cpp +++ b/src/libs/languageserverprotocol/languagefeatures.cpp @@ -277,15 +277,30 @@ GotoResult::GotoResult(const QJsonValue &value) } } +template +QList documentSymbolsResultArray(const QJsonArray &array) +{ + QList ret; + for (auto arrayValue : array) { + if (arrayValue.isObject()) + ret << Symbol(arrayValue.toObject()); + } + return ret; +} + DocumentSymbolsResult::DocumentSymbolsResult(const QJsonValue &value) { if (value.isArray()) { - QList symbols; - for (auto arrayValue : value.toArray()) { - if (arrayValue.isObject()) - symbols.append(SymbolInformation(arrayValue.toObject())); + QJsonArray array = value.toArray(); + if (array.isEmpty()) { + *this = QList(); + } else { + QJsonObject arrayObject = array.first().toObject(); + if (arrayObject.contains(rangeKey)) + *this = documentSymbolsResultArray(array); + else + *this = documentSymbolsResultArray(array); } - *this = symbols; } else { *this = nullptr; } diff --git a/src/libs/languageserverprotocol/languagefeatures.h b/src/libs/languageserverprotocol/languagefeatures.h index 15af8ab3222..d585ce8c9fa 100644 --- a/src/libs/languageserverprotocol/languagefeatures.h +++ b/src/libs/languageserverprotocol/languagefeatures.h @@ -323,7 +323,7 @@ public: using DocumentSymbolParams = TextDocumentParams; class LANGUAGESERVERPROTOCOL_EXPORT DocumentSymbolsResult - : public Utils::variant, std::nullptr_t> + : public Utils::variant, QList, std::nullptr_t> { public: using variant::variant; diff --git a/src/libs/languageserverprotocol/lsptypes.h b/src/libs/languageserverprotocol/lsptypes.h index ed56c16435c..6c73ecb3214 100644 --- a/src/libs/languageserverprotocol/lsptypes.h +++ b/src/libs/languageserverprotocol/lsptypes.h @@ -430,6 +430,10 @@ public: int kind() const { return typedValue(kindKey); } void setKind(int kind) { insert(kindKey, kind); } + Utils::optional deprecated() const { return optionalValue(deprecatedKey); } + void setDeprecated(bool deprecated) { insert(deprecatedKey, deprecated); } + void clearDeprecated() { remove(deprecatedKey); } + Location location() const { return typedValue(locationKey); } void setLocation(const Location &location) { insert(locationKey, location); } @@ -441,6 +445,37 @@ public: bool isValid(QStringList *error) const override; }; +class LANGUAGESERVERPROTOCOL_EXPORT DocumentSymbol : public JsonObject +{ +public: + using JsonObject::JsonObject; + + QString name() const { return typedValue(nameKey); } + void setName(const QString &name) { insert(nameKey, name); } + + Utils::optional detail() const { return optionalValue(detailKey); } + void setDetail(const QString &detail) { insert(detailKey, detail); } + void clearDetail() { remove(detailKey); } + + int kind() const { return typedValue(kindKey); } + void setKind(int kind) { insert(kindKey, kind); } + + Utils::optional deprecated() const { return optionalValue(deprecatedKey); } + void setDeprecated(bool deprecated) { insert(deprecatedKey, deprecated); } + void clearDeprecated() { remove(deprecatedKey); } + + Range range() const { return typedValue(rangeKey); } + void setRange(Range range) { insert(rangeKey, range); } + + Range selectionRange() const { return typedValue(selectionRangeKey); } + void setSelectionRange(Range selectionRange) { insert(selectionRangeKey, selectionRange); } + + Utils::optional> children() const + { return optionalArray(childrenKey); } + void setChildren(QList children) { insertArray(childrenKey, children); } + void clearChildren() { remove(childrenKey); } +}; + enum class SymbolKind { File = 1, FirstSymbolKind = File,