diff --git a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp index 98e58da8815..1d6fbf0e2a2 100644 --- a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp @@ -2,11 +2,13 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "cmakeeditor.h" +#include "cmaketoolmanager.h" #include "cmakeautocompleter.h" #include "cmakebuildsystem.h" #include "cmakefilecompletionassist.h" #include "cmakeindenter.h" +#include "cmakekitaspect.h" #include "cmakeprojectconstants.h" #include @@ -16,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -36,52 +39,55 @@ namespace CMakeProjectManager::Internal { class CMakeEditor : public TextEditor::BaseTextEditor { + CMakeKeywords m_keywords; public: + CMakeEditor(); 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 { - 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; - do { - --pos; - if (pos < 0) - break; - chr = characterAt(pos); - if (chr == QLatin1Char('(')) { - BaseTextEditor::contextHelp(callback); - return; - } - } while (chr.unicode() != QChar::ParagraphSeparator); + return "unknown/"; + }; - ++pos; - chr = characterAt(pos); - 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('(')) { + const QString id = helpPrefix(word) + word; + if (id.startsWith("unknown/")) { BaseTextEditor::contextHelp(callback); return; } - const QString id = "command/" + textAt(begin, end - begin).toLower(); callback({{id, Utils::Text::wordUnderCursor(editorWidget()->textCursor())}, {}, {}, diff --git a/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp b/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp index b50d3128363..92abd32f510 100644 --- a/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp +++ b/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp @@ -139,9 +139,10 @@ static int findPathStart(const AssistInterface *interface) return ++pos; } -QList generateList(const QStringList &words, const QIcon &icon) +template +QList generateList(const T &words, const QIcon &icon) { - return transform(words, [&icon](const QString &word) -> AssistProposalItemInterface * { + return transform(words, [&icon](const QString &word) -> AssistProposalItemInterface * { AssistProposalItem *item = new AssistProposalItem(); item->setText(word); item->setIcon(icon); diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index 65068e74ee2..f992a82bfbb 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -280,17 +280,17 @@ CMakeKeywords CMakeTool::keywords() } CMakeKeywords keywords; - keywords.functions = m_introspection->m_functions; - keywords.variables = m_introspection->m_variables; + keywords.functions = Utils::toSet(m_introspection->m_functions); + keywords.variables = Utils::toSet(m_introspection->m_variables); keywords.functionArgs = m_introspection->m_functionArgs; - keywords.properties = m_introspection->m_properties; - keywords.generatorExpressions = m_introspection->m_generatorExpressions; - keywords.directoryProperties = m_introspection->m_directoryProperties; - keywords.sourceProperties = m_introspection->m_sourceProperties; - keywords.targetProperties = m_introspection->m_targetProperties; - keywords.testProperties = m_introspection->m_testProperties; - keywords.includeStandardModules = m_introspection->m_includeStandardModules; - keywords.findModules = m_introspection->m_findModules; + keywords.properties = Utils::toSet(m_introspection->m_properties); + keywords.generatorExpressions = Utils::toSet(m_introspection->m_generatorExpressions); + keywords.directoryProperties = Utils::toSet(m_introspection->m_directoryProperties); + keywords.sourceProperties = Utils::toSet(m_introspection->m_sourceProperties); + keywords.targetProperties = Utils::toSet(m_introspection->m_targetProperties); + keywords.testProperties = Utils::toSet(m_introspection->m_testProperties); + keywords.includeStandardModules = Utils::toSet(m_introspection->m_includeStandardModules); + keywords.findModules = Utils::toSet(m_introspection->m_findModules); return keywords; } diff --git a/src/plugins/cmakeprojectmanager/cmaketool.h b/src/plugins/cmakeprojectmanager/cmaketool.h index d090b6fd97f..7a1b8fbc828 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.h +++ b/src/plugins/cmakeprojectmanager/cmaketool.h @@ -21,16 +21,16 @@ namespace Internal { class IntrospectionData; } struct CMAKE_EXPORT CMakeKeywords { - QStringList variables; - QStringList functions; - QStringList properties; - QStringList generatorExpressions; - QStringList directoryProperties; - QStringList sourceProperties; - QStringList targetProperties; - QStringList testProperties; - QStringList includeStandardModules; - QStringList findModules; + QSet variables; + QSet functions; + QSet properties; + QSet generatorExpressions; + QSet directoryProperties; + QSet sourceProperties; + QSet targetProperties; + QSet testProperties; + QSet includeStandardModules; + QSet findModules; QMap functionArgs; };