diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index f1a5d3cfbeb..866fbf89d59 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -1141,6 +1141,7 @@ void CMakeBuildSystem::handleParsingSucceeded(bool restoredFromBackup) }); m_buildTargets += m_reader.takeBuildTargets(errorMessage); m_cmakeFiles = m_reader.takeCMakeFileInfos(errorMessage); + setupCMakeSymbolsHash(); checkAndReportError(errorMessage); } @@ -1245,6 +1246,29 @@ void CMakeBuildSystem::wireUpConnections() } } +void CMakeBuildSystem::setupCMakeSymbolsHash() +{ + m_cmakeSymbolsHash.clear(); + + for (const auto &cmakeFile : std::as_const(m_cmakeFiles)) { + for (const auto &func : cmakeFile.cmakeListFile.Functions) { + if (func.LowerCaseName() != "function" && func.LowerCaseName() != "macro" + && func.LowerCaseName() != "option") + continue; + + if (func.Arguments().size() == 0) + continue; + auto arg = func.Arguments()[0]; + + Utils::Link link; + link.targetFilePath = cmakeFile.path; + link.targetLine = arg.Line; + link.targetColumn = arg.Column - 1; + m_cmakeSymbolsHash.insert(QString::fromUtf8(arg.Value), link); + } + } +} + void CMakeBuildSystem::ensureBuildDirectory(const BuildDirParameters ¶meters) { const FilePath bdir = parameters.buildDirectory; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.h b/src/plugins/cmakeprojectmanager/cmakebuildsystem.h index 068fbc986e1..ca67d5549e2 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.h @@ -18,7 +18,10 @@ namespace ProjectExplorer { class ExtraCompiler; class FolderNode; } -namespace Utils { class Process; } +namespace Utils { + class Process; + class Link; +} namespace CMakeProjectManager { @@ -115,6 +118,8 @@ public: QString error() const; QString warning() const; + const QHash &cmakeSymbolsHash() const { return m_cmakeSymbolsHash; } + signals: void configurationCleared(); void configurationChanged(const CMakeConfig &config); @@ -190,6 +195,8 @@ private: void runCTest(); + void setupCMakeSymbolsHash(); + struct ProjectFileArgumentPosition { cmListFileArgument argumentPosition; @@ -215,6 +222,7 @@ private: QList m_extraCompilers; QList m_buildTargets; QSet m_cmakeFiles; + QHash m_cmakeSymbolsHash; QHash m_filesToBeRenamed; diff --git a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp index 65b69bce2dd..7fd96fc8439 100644 --- a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp @@ -4,6 +4,7 @@ #include "cmakeeditor.h" #include "cmakeautocompleter.h" +#include "cmakebuildsystem.h" #include "cmakefilecompletionassist.h" #include "cmakeindenter.h" #include "cmakeprojectconstants.h" @@ -206,6 +207,11 @@ void CMakeEditorWidget::findLinkAt(const QTextCursor &cursor, ->buildDirectory() .pathAppended(relativePathSuffix) .path()); + + // Check if the symbols is a user defined function or macro + const CMakeBuildSystem *cbs = static_cast(bs); + if (cbs->cmakeSymbolsHash().contains(buffer)) + return processLinkCallback(cbs->cmakeSymbolsHash().value(buffer)); } } // TODO: Resolve more variables @@ -259,11 +265,11 @@ CMakeEditorFactory::CMakeEditorFactory() setAutoCompleterCreator([] { return new CMakeAutoCompleter; }); setEditorActionHandlers(TextEditorActionHandler::UnCommentSelection - | TextEditorActionHandler::JumpToFileUnderCursor - | TextEditorActionHandler::Format); + | TextEditorActionHandler::FollowSymbolUnderCursor + | TextEditorActionHandler::Format); ActionContainer *contextMenu = ActionManager::createMenu(Constants::M_CONTEXT); - contextMenu->addAction(ActionManager::command(TextEditor::Constants::JUMP_TO_FILE_UNDER_CURSOR)); + contextMenu->addAction(ActionManager::command(TextEditor::Constants::FOLLOW_SYMBOL_UNDER_CURSOR)); contextMenu->addSeparator(Context(Constants::CMAKE_EDITOR_ID)); contextMenu->addAction(ActionManager::command(TextEditor::Constants::UN_COMMENT_SELECTION)); }