diff --git a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp index 1979d6ef76d..a821648f24b 100644 --- a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp @@ -77,6 +77,8 @@ void CMakeEditor::contextHelp(const HelpCallback &callback) const return "prop_gbl/"; if (m_keywords.policies.contains(word)) return "policy/"; + if (m_keywords.environmentVariables.contains(word)) + return "envvar/"; return "unknown/"; }; @@ -449,15 +451,16 @@ void CMakeHoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget const QMap ↦ QString helpCategory; } keywordsListMaps[] = {{keywords().functions, "command"}, - {keywords().variables, "variable"}, - {keywords().directoryProperties, "prop_dir"}, - {keywords().sourceProperties, "prop_sf"}, - {keywords().targetProperties, "prop_tgt"}, - {keywords().testProperties, "prop_test"}, - {keywords().properties, "prop_gbl"}, - {keywords().includeStandardModules, "module"}, - {keywords().findModules, "module"}, - {keywords().policies, "policy"}}; + {keywords().variables, "variable"}, + {keywords().directoryProperties, "prop_dir"}, + {keywords().sourceProperties, "prop_sf"}, + {keywords().targetProperties, "prop_tgt"}, + {keywords().testProperties, "prop_test"}, + {keywords().properties, "prop_gbl"}, + {keywords().includeStandardModules, "module"}, + {keywords().findModules, "module"}, + {keywords().policies, "policy"}, + {keywords().environmentVariables, "envvar"}}; for (const auto &pair : keywordsListMaps) { if (pair.map.contains(word)) { diff --git a/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp b/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp index 8be8fa7f91d..2161c9b72d5 100644 --- a/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp +++ b/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp @@ -469,7 +469,8 @@ IAssistProposal *CMakeFileCompletionAssist::doPerform(const PerformInputDataPtr QList items; const QString varGenexToken = interface()->textAt(startPos - 2, 2); - if (varGenexToken == "${" || varGenexToken == "$<") { + const QString varEnvironmentToken = interface()->textAt(startPos - 5, 5); + if (varGenexToken == "${" || varGenexToken == "$<" || varEnvironmentToken == "$ENV{") { if (varGenexToken == "${") { items.append(generateList(data->keywords.variables, m_variableIcon)); items.append(generateList(data->projectVariables, m_projectVariableIcon)); @@ -478,9 +479,16 @@ IAssistProposal *CMakeFileCompletionAssist::doPerform(const PerformInputDataPtr if (varGenexToken == "$<") items.append(generateList(data->keywords.generatorExpressions, m_genexIcon)); + if (varEnvironmentToken == "$ENV{") + items.append(generateList(data->keywords.environmentVariables, m_variableIcon)); + return new GenericProposal(startPos, items); } + const QString ifEnvironmentToken = interface()->textAt(startPos - 4, 4); + if ((functionName == "if" || functionName == "elseif") && ifEnvironmentToken == "ENV{") + items.append(generateList(data->keywords.environmentVariables, m_variableIcon)); + int fileStartPos = startPos; const auto onlyFileItems = [&] { return fileStartPos != startPos; }; @@ -569,13 +577,13 @@ IAssistProcessor *CMakeFileCompletionAssistProvider::createProcessor(const Assis int CMakeFileCompletionAssistProvider::activationCharSequenceLength() const { - return 2; + return 4; } bool CMakeFileCompletionAssistProvider::isActivationCharSequence(const QString &sequence) const { return sequence.endsWith("${") || sequence.endsWith("$<") || sequence.endsWith("/") - || sequence.endsWith("("); + || sequence.endsWith("(") || sequence.endsWith("ENV{"); } } // namespace CMakeProjectManager::Internal diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index 5eba0d642de..a24114bb352 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -288,6 +288,8 @@ CMakeKeywords CMakeTool::keywords() {"Help/variable", m_introspection->m_keywords.variables}, // Policies {"Help/policy", m_introspection->m_keywords.policies}, + // Environment Variables + {"Help/envvar", m_introspection->m_keywords.environmentVariables}, }; for (auto &i : introspections) { const FilePaths files = cmakeRoot.pathAppended(i.helpPath) diff --git a/src/plugins/cmakeprojectmanager/cmaketool.h b/src/plugins/cmakeprojectmanager/cmaketool.h index b72a926c768..c9bc6e02e3c 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.h +++ b/src/plugins/cmakeprojectmanager/cmaketool.h @@ -25,6 +25,7 @@ struct CMAKE_EXPORT CMakeKeywords QMap functions; QMap properties; QSet generatorExpressions; + QMap environmentVariables; QMap directoryProperties; QMap sourceProperties; QMap targetProperties; diff --git a/tests/manual/cmakeprojectmanager/completion/CMakeLists.txt b/tests/manual/cmakeprojectmanager/completion/CMakeLists.txt index 785fea0408f..15b083cbd5a 100644 --- a/tests/manual/cmakeprojectmanager/completion/CMakeLists.txt +++ b/tests/manual/cmakeprojectmanager/completion/CMakeLists.txt @@ -53,6 +53,13 @@ if (SOURCE_FILES) cmake_print_variables(SOURCE_FILES) endif() +# here code completion for "if (ENV{|" should popup the CMake supported environment variables +# also deleting { and typing again { should trigger the menu +#if (ENV{ + +# hover over CXX should display the help for the CXX environment variable +# and F1 should open the help page +message(STATUS $ENV{CXX}) qt_add_executable(completion ${SOURCE_FILES})