forked from qt-creator/qt-creator
CMakePM: Navigate to find_package CMake files
Fixes: QTCREATORBUG-25524 Change-Id: I6dc7dc1b2d0da06ceba0314438d3bd12467a3223 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
@@ -1391,6 +1391,40 @@ void CMakeBuildSystem::setupCMakeSymbolsHash()
|
||||
}
|
||||
};
|
||||
|
||||
// Gather all Find<Package>.cmake and <Package>Config.cmake / <Package>-config.cmake files
|
||||
m_findPackagesFilesHash.clear();
|
||||
auto handleFindPackageCMakeFiles = [&](const CMakeFileInfo &cmakeFile) {
|
||||
const QString fileName = cmakeFile.path.fileName();
|
||||
|
||||
const QString findPackageName = [fileName]() -> QString {
|
||||
auto findIdx = fileName.indexOf("Find");
|
||||
auto endsWithCMakeIdx = fileName.lastIndexOf(".cmake");
|
||||
if (findIdx == 0 && endsWithCMakeIdx > 0)
|
||||
return fileName.mid(4, endsWithCMakeIdx - 4);
|
||||
return QString();
|
||||
}();
|
||||
|
||||
const QString configPackageName = [fileName]() -> QString {
|
||||
auto configCMakeIdx = fileName.lastIndexOf("Config.cmake");
|
||||
if (configCMakeIdx > 0)
|
||||
return fileName.left(configCMakeIdx);
|
||||
auto dashConfigCMakeIdx = fileName.lastIndexOf("-config.cmake");
|
||||
if (dashConfigCMakeIdx > 0)
|
||||
return fileName.left(dashConfigCMakeIdx);
|
||||
return QString();
|
||||
}();
|
||||
|
||||
if (!findPackageName.isEmpty() || !configPackageName.isEmpty()) {
|
||||
Utils::Link link;
|
||||
link.targetFilePath = cmakeFile.path;
|
||||
link.targetLine = 1;
|
||||
link.targetColumn = 0;
|
||||
m_findPackagesFilesHash.insert(!findPackageName.isEmpty() ? findPackageName
|
||||
: configPackageName,
|
||||
link);
|
||||
}
|
||||
};
|
||||
|
||||
for (const auto &cmakeFile : std::as_const(m_cmakeFiles)) {
|
||||
for (const auto &func : cmakeFile.cmakeListFile.Functions) {
|
||||
handleFunctionMacroOption(cmakeFile, func);
|
||||
@@ -1398,6 +1432,7 @@ void CMakeBuildSystem::setupCMakeSymbolsHash()
|
||||
handleProjectTargets(cmakeFile, func);
|
||||
handleFindPackageVariables(cmakeFile, func);
|
||||
handleDotCMakeFiles(cmakeFile);
|
||||
handleFindPackageCMakeFiles(cmakeFile);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -124,6 +124,7 @@ public:
|
||||
QStringList projectImportedTargets() const { return m_projectImportedTargets; }
|
||||
QStringList projectFindPackageVariables() const { return m_projectFindPackageVariables; }
|
||||
const QHash<QString, Utils::Link> &dotCMakeFilesHash() const { return m_dotCMakeFilesHash; }
|
||||
const QHash<QString, Utils::Link> &findPackagesFilesHash() const { return m_findPackagesFilesHash; }
|
||||
|
||||
signals:
|
||||
void configurationCleared();
|
||||
@@ -230,6 +231,7 @@ private:
|
||||
QSet<CMakeFileInfo> m_cmakeFiles;
|
||||
QHash<QString, Utils::Link> m_cmakeSymbolsHash;
|
||||
QHash<QString, Utils::Link> m_dotCMakeFilesHash;
|
||||
QHash<QString, Utils::Link> m_findPackagesFilesHash;
|
||||
CMakeKeywords m_projectKeywords;
|
||||
QStringList m_projectImportedTargets;
|
||||
QStringList m_projectFindPackageVariables;
|
||||
|
||||
@@ -338,19 +338,29 @@ void CMakeEditorWidget::findLinkAt(const QTextCursor &cursor,
|
||||
return processLinkCallback(link);
|
||||
}
|
||||
|
||||
// Handle include(CMakeFileWithoutSuffix)
|
||||
// Handle include(CMakeFileWithoutSuffix) and find_package(Package)
|
||||
QString functionName;
|
||||
if (funcStart > funcEnd) {
|
||||
int funcStartPos = findWordStart(funcStart);
|
||||
functionName = textDocument()->textAt(funcStartPos, funcStart - funcStartPos);
|
||||
if (functionName == "include" && cbs->dotCMakeFilesHash().contains(buffer)) {
|
||||
link = cbs->dotCMakeFilesHash().value(buffer);
|
||||
|
||||
struct FunctionToHash
|
||||
{
|
||||
QString functionName;
|
||||
const QHash<QString, Utils::Link> &hash;
|
||||
} functionToHashes[] = {{"include", cbs->dotCMakeFilesHash()},
|
||||
{"find_package", cbs->findPackagesFilesHash()}};
|
||||
|
||||
for (const auto &pair : functionToHashes) {
|
||||
if (functionName == pair.functionName && pair.hash.contains(buffer)) {
|
||||
link = pair.hash.value(buffer);
|
||||
addTextStartEndToLink(link);
|
||||
return processLinkCallback(link);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// TODO: Resolve more variables
|
||||
|
||||
// Resolve local variables and functions
|
||||
|
||||
Reference in New Issue
Block a user