From a51b8a061e91ed615bd48b348dcc133e01f49dbf Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 11 Jun 2019 11:06:32 +0200 Subject: [PATCH] CMakeTool: Update cmake fileapi detection CMake rejected a patch to add fileapi detection via cmake -E capabilities output and asked to base the detection on the version number. This decision has been revisited now and starting with cmake 3.15 the supported fileapi object kinds and there version are reported. Update Creator to use this information and to fill in the missing data for cmake 3.14. Change-Id: I382310a098925491921acf1b59099bbe0859cde2 Reviewed-by: Cristian Adam Reviewed-by: Tobias Hunger --- src/plugins/cmakeprojectmanager/cmaketool.cpp | 48 +++++++++++++++++-- src/plugins/cmakeprojectmanager/cmaketool.h | 1 + 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index c685b37cb9d..1e186defe79 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -61,6 +61,12 @@ namespace Internal { // CMakeIntrospectionData: // -------------------------------------------------------------------- +class FileApi { +public: + QString kind; + std::pair version; +}; + class IntrospectionData { public: @@ -73,6 +79,7 @@ public: QList m_generators; QMap m_functionArgs; + QVector m_fileApis; QStringList m_variables; QStringList m_functions; CMakeTool::Version m_version; @@ -250,9 +257,14 @@ bool CMakeTool::hasServerMode() const bool CMakeTool::hasFileApi() const { - readInformation(QueryType::VERSION); - return m_introspection->m_version.major > 3 - || (m_introspection->m_version.major == 3 && m_introspection->m_version.minor >= 14); + readInformation(QueryType::SERVER_MODE); + return !m_introspection->m_fileApis.isEmpty(); +} + +QVector > CMakeTool::supportedFileApiObjects() const +{ + readInformation(QueryType::SERVER_MODE); + return Utils::transform(m_introspection->m_fileApis, [](const Internal::FileApi &api) { return std::make_pair(api.kind, api.version.first); }); } CMakeTool::Version CMakeTool::version() const @@ -495,6 +507,15 @@ void CMakeTool::fetchFromCapabilities() const parseFromCapabilities(response.stdOut()); } +static int getVersion(const QVariantMap &obj, const QString value) +{ + bool ok; + int result = obj.value(value).toInt(&ok); + if (!ok) + return -1; + return result; +} + void CMakeTool::parseFromCapabilities(const QString &input) const { auto doc = QJsonDocument::fromJson(input.toUtf8()); @@ -512,11 +533,32 @@ void CMakeTool::parseFromCapabilities(const QString &input) const gen.value("toolsetSupport").toBool())); } + { + const QVariantMap fileApis = data.value("fileApi").toMap(); + const QVariantList requests = fileApis.value("requests").toList(); + for (const QVariant &r: requests) { + const QVariantMap object = r.toMap(); + const QString kind = object.value("kind").toString(); + const QVariantMap versionObject = object.value("version").toMap(); + const std::pair version = std::make_pair(getVersion(versionObject, "major"), + getVersion(versionObject, "minor")); + if (!kind.isNull() && version.first != -1 && version.second != -1) + m_introspection->m_fileApis.append({kind, version}); + } + } + const QVariantMap versionInfo = data.value("version").toMap(); m_introspection->m_version.major = versionInfo.value("major").toInt(); m_introspection->m_version.minor = versionInfo.value("minor").toInt(); m_introspection->m_version.patch = versionInfo.value("patch").toInt(); m_introspection->m_version.fullVersion = versionInfo.value("string").toByteArray(); + + // Fix up fileapi support for cmake 3.14: + if (m_introspection->m_version.major == 3 && m_introspection->m_version.minor == 14) { + m_introspection->m_fileApis.append({QString("codemodel"), std::make_pair(2, 0)}); + m_introspection->m_fileApis.append({QString("cache"), std::make_pair(2, 0)}); + m_introspection->m_fileApis.append({QString("cmakefiles"), std::make_pair(1, 0)}); + } } } // namespace CMakeProjectManager diff --git a/src/plugins/cmakeprojectmanager/cmaketool.h b/src/plugins/cmakeprojectmanager/cmaketool.h index 45af7ba329e..73044d8ba40 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.h +++ b/src/plugins/cmakeprojectmanager/cmaketool.h @@ -100,6 +100,7 @@ public: TextEditor::Keywords keywords(); bool hasServerMode() const; bool hasFileApi() const; + QVector> supportedFileApiObjects() const; Version version() const; bool isAutoDetected() const;