CMakePM: Expand help for variables, properties and modules

Not only CMake functions.

Change-Id: Icd21eb39a55533261f2b5c170a9dbd38a640e3e9
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Cristian Adam
2023-09-20 14:17:18 +02:00
parent 77b368045c
commit a998269d7e
4 changed files with 63 additions and 56 deletions

View File

@@ -2,11 +2,13 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "cmakeeditor.h" #include "cmakeeditor.h"
#include "cmaketoolmanager.h"
#include "cmakeautocompleter.h" #include "cmakeautocompleter.h"
#include "cmakebuildsystem.h" #include "cmakebuildsystem.h"
#include "cmakefilecompletionassist.h" #include "cmakefilecompletionassist.h"
#include "cmakeindenter.h" #include "cmakeindenter.h"
#include "cmakekitaspect.h"
#include "cmakeprojectconstants.h" #include "cmakeprojectconstants.h"
#include <coreplugin/actionmanager/actioncontainer.h> #include <coreplugin/actionmanager/actioncontainer.h>
@@ -16,6 +18,7 @@
#include <projectexplorer/buildsystem.h> #include <projectexplorer/buildsystem.h>
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
#include <projectexplorer/projecttree.h> #include <projectexplorer/projecttree.h>
#include <projectexplorer/target.h>
#include <texteditor/textdocument.h> #include <texteditor/textdocument.h>
#include <texteditor/texteditoractionhandler.h> #include <texteditor/texteditoractionhandler.h>
#include <utils/textutils.h> #include <utils/textutils.h>
@@ -36,52 +39,55 @@ namespace CMakeProjectManager::Internal {
class CMakeEditor : public TextEditor::BaseTextEditor class CMakeEditor : public TextEditor::BaseTextEditor
{ {
CMakeKeywords m_keywords;
public: public:
CMakeEditor();
void contextHelp(const HelpCallback &callback) const final; void contextHelp(const HelpCallback &callback) const final;
}; };
CMakeEditor::CMakeEditor()
{
CMakeTool *tool = nullptr;
if (auto project = ProjectTree::currentProject())
if (auto bs = ProjectTree::currentBuildSystem())
tool = CMakeKitAspect::cmakeTool(bs->target()->kit());
if (!tool)
tool = CMakeToolManager::defaultCMakeTool();
if (tool)
m_keywords = tool->keywords();
}
void CMakeEditor::contextHelp(const HelpCallback &callback) const void CMakeEditor::contextHelp(const HelpCallback &callback) const
{ {
int pos = position(); const QString word = Utils::Text::wordUnderCursor(editorWidget()->textCursor());
auto helpPrefix = [this](const QString &word) {
if (m_keywords.includeStandardModules.contains(word))
return "module/";
if (m_keywords.functions.contains(word))
return "command/";
if (m_keywords.variables.contains(word))
return "variable/";
if (m_keywords.directoryProperties.contains(word))
return "prop_dir/";
if (m_keywords.targetProperties.contains(word))
return "prop_tgt/";
if (m_keywords.sourceProperties.contains(word))
return "prop_sf/";
if (m_keywords.testProperties.contains(word))
return "prop_test/";
if (m_keywords.properties.contains(word))
return "prop_gbl/";
QChar chr; return "unknown/";
do { };
--pos;
if (pos < 0)
break;
chr = characterAt(pos);
if (chr == QLatin1Char('(')) {
BaseTextEditor::contextHelp(callback);
return;
}
} while (chr.unicode() != QChar::ParagraphSeparator);
++pos; const QString id = helpPrefix(word) + word;
chr = characterAt(pos); if (id.startsWith("unknown/")) {
while (chr.isSpace()) {
++pos;
chr = characterAt(pos);
}
int begin = pos;
do {
++pos;
chr = characterAt(pos);
} while (chr.isLetterOrNumber() || chr == QLatin1Char('_'));
int end = pos;
while (chr.isSpace()) {
++pos;
chr = characterAt(pos);
}
// Not a command
if (chr != QLatin1Char('(')) {
BaseTextEditor::contextHelp(callback); BaseTextEditor::contextHelp(callback);
return; return;
} }
const QString id = "command/" + textAt(begin, end - begin).toLower();
callback({{id, Utils::Text::wordUnderCursor(editorWidget()->textCursor())}, callback({{id, Utils::Text::wordUnderCursor(editorWidget()->textCursor())},
{}, {},
{}, {},

View File

@@ -139,9 +139,10 @@ static int findPathStart(const AssistInterface *interface)
return ++pos; return ++pos;
} }
QList<AssistProposalItemInterface *> generateList(const QStringList &words, const QIcon &icon) template<typename T>
QList<AssistProposalItemInterface *> generateList(const T &words, const QIcon &icon)
{ {
return transform(words, [&icon](const QString &word) -> AssistProposalItemInterface * { return transform<QList>(words, [&icon](const QString &word) -> AssistProposalItemInterface * {
AssistProposalItem *item = new AssistProposalItem(); AssistProposalItem *item = new AssistProposalItem();
item->setText(word); item->setText(word);
item->setIcon(icon); item->setIcon(icon);

View File

@@ -280,17 +280,17 @@ CMakeKeywords CMakeTool::keywords()
} }
CMakeKeywords keywords; CMakeKeywords keywords;
keywords.functions = m_introspection->m_functions; keywords.functions = Utils::toSet(m_introspection->m_functions);
keywords.variables = m_introspection->m_variables; keywords.variables = Utils::toSet(m_introspection->m_variables);
keywords.functionArgs = m_introspection->m_functionArgs; keywords.functionArgs = m_introspection->m_functionArgs;
keywords.properties = m_introspection->m_properties; keywords.properties = Utils::toSet(m_introspection->m_properties);
keywords.generatorExpressions = m_introspection->m_generatorExpressions; keywords.generatorExpressions = Utils::toSet(m_introspection->m_generatorExpressions);
keywords.directoryProperties = m_introspection->m_directoryProperties; keywords.directoryProperties = Utils::toSet(m_introspection->m_directoryProperties);
keywords.sourceProperties = m_introspection->m_sourceProperties; keywords.sourceProperties = Utils::toSet(m_introspection->m_sourceProperties);
keywords.targetProperties = m_introspection->m_targetProperties; keywords.targetProperties = Utils::toSet(m_introspection->m_targetProperties);
keywords.testProperties = m_introspection->m_testProperties; keywords.testProperties = Utils::toSet(m_introspection->m_testProperties);
keywords.includeStandardModules = m_introspection->m_includeStandardModules; keywords.includeStandardModules = Utils::toSet(m_introspection->m_includeStandardModules);
keywords.findModules = m_introspection->m_findModules; keywords.findModules = Utils::toSet(m_introspection->m_findModules);
return keywords; return keywords;
} }

View File

@@ -21,16 +21,16 @@ namespace Internal { class IntrospectionData; }
struct CMAKE_EXPORT CMakeKeywords struct CMAKE_EXPORT CMakeKeywords
{ {
QStringList variables; QSet<QString> variables;
QStringList functions; QSet<QString> functions;
QStringList properties; QSet<QString> properties;
QStringList generatorExpressions; QSet<QString> generatorExpressions;
QStringList directoryProperties; QSet<QString> directoryProperties;
QStringList sourceProperties; QSet<QString> sourceProperties;
QStringList targetProperties; QSet<QString> targetProperties;
QStringList testProperties; QSet<QString> testProperties;
QStringList includeStandardModules; QSet<QString> includeStandardModules;
QStringList findModules; QSet<QString> findModules;
QMap<QString, QStringList> functionArgs; QMap<QString, QStringList> functionArgs;
}; };