diff --git a/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp b/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp index 2161c9b72d5..7a656722bb4 100644 --- a/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp +++ b/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp @@ -158,6 +158,11 @@ static int findPathStart(const AssistInterface *interface) return ++pos; } +struct MarkDownAssitProposalItem : public AssistProposalItem +{ + Qt::TextFormat detailFormat() const override { return Qt::MarkdownText; } +}; + template static QList generateList(const T &words, const QIcon &icon) { @@ -172,11 +177,6 @@ static QList generateList(const T &words, const Q static QList generateList(const QMap &words, const QIcon &icon) { - struct MarkDownAssitProposalItem : public AssistProposalItem - { - Qt::TextFormat detailFormat() const override { return Qt::MarkdownText; } - }; - QList list; for (auto it = words.cbegin(); it != words.cend(); ++it) { MarkDownAssitProposalItem *item = new MarkDownAssitProposalItem(); @@ -189,6 +189,55 @@ static QList generateList(const QMap generateList( + const CMakeConfig &cache, + const QIcon &icon, + const QList &existingList) +{ + QHash hash; + for (const auto &item : existingList) + hash.insert(item->text(), item); + + auto makeDetail = [](const CMakeConfigItem &item) { + QString detail = QString("### %1 (cache)").arg(QString::fromUtf8(item.key)); + + if (!item.documentation.isEmpty()) + detail.append(QString("\n%1\n").arg(QString::fromUtf8(item.documentation))); + else + detail.append("\n"); + + const QString value = item.toString(); + if (!value.isEmpty()) + detail.append(QString("\n```\n%1\n```\n").arg(value)); + + return detail; + }; + + QList list; + for (auto it = cache.cbegin(); it != cache.cend(); ++it) { + if (it->isAdvanced || it->isUnset || it->type == CMakeConfig::Type::INTERNAL) + continue; + + QString text = QString::fromUtf8(it->key); + if (!hash.contains(text)) { + MarkDownAssitProposalItem *item = new MarkDownAssitProposalItem(); + item->setText(text); + item->setDetail(makeDetail(*it)); + item->setIcon(icon); + list << item; + } else { + auto item = static_cast(hash.value(text)); + + QString detail = item->detail(); + detail.append("\n"); + detail.append(makeDetail(*it)); + + item->setDetail(detail); + } + } + return list; +} + static int addFilePathItems(const AssistInterface *interface, QList &items, int symbolStartPos) @@ -499,6 +548,7 @@ IAssistProposal *CMakeFileCompletionAssist::doPerform(const PerformInputDataPtr items.append(generateList(data->projectVariables, m_projectVariableIcon)); items.append(generateList(data->findPackageVariables, m_projectVariableIcon)); items.append(generateList(localVariables, m_variableIcon)); + items.append(generateList(cmakeConfiguration, m_variableIcon, items)); } if (functionName == "if" || functionName == "elseif" || functionName == "cmake_policy") @@ -559,6 +609,7 @@ IAssistProposal *CMakeFileCompletionAssist::doPerform(const PerformInputDataPtr items.append(generateList(data->keywords.variables, m_variableIcon)); items.append(generateList(data->projectVariables, m_projectVariableIcon)); items.append(generateList(localVariables, m_variableIcon)); + items.append(generateList(cmakeConfiguration, m_variableIcon, items)); items.append(generateList(data->findPackageVariables, m_projectVariableIcon)); items.append(generateList(data->keywords.properties, m_propertyIcon)); diff --git a/tests/manual/cmakeprojectmanager/completion/CMakeLists.txt b/tests/manual/cmakeprojectmanager/completion/CMakeLists.txt index 15b083cbd5a..a3b5ddf4efb 100644 --- a/tests/manual/cmakeprojectmanager/completion/CMakeLists.txt +++ b/tests/manual/cmakeprojectmanager/completion/CMakeLists.txt @@ -84,3 +84,8 @@ set_target_properties(completion PROPERTIES # here completion for "WIN32|" should popup WIN32_EXECUTABLE #WIN32 ) + +include(JustACacheVariable) +# here code completion for "if (JUST|" should complete with if (JUST_A_CACHE_VARIABLE +# as a tooltip containing the description +#if (JUST diff --git a/tests/manual/cmakeprojectmanager/completion/cmake/JustACacheVariable.cmake b/tests/manual/cmakeprojectmanager/completion/cmake/JustACacheVariable.cmake new file mode 100644 index 00000000000..ce9ed4aab42 --- /dev/null +++ b/tests/manual/cmakeprojectmanager/completion/cmake/JustACacheVariable.cmake @@ -0,0 +1 @@ +set(JUST_A_CACHE_VARIABLE ON CACHE BOOL "This was set from cmake/JustACacheVariable" FORCE)