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:
Cristian Adam
2023-10-02 12:47:05 +02:00
parent bc5a2dbf14
commit 3705b4b609
3 changed files with 52 additions and 5 deletions

View File

@@ -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 &cmakeFile : std::as_const(m_cmakeFiles)) {
for (const auto &func : cmakeFile.cmakeListFile.Functions) { for (const auto &func : cmakeFile.cmakeListFile.Functions) {
handleFunctionMacroOption(cmakeFile, func); handleFunctionMacroOption(cmakeFile, func);
@@ -1398,6 +1432,7 @@ void CMakeBuildSystem::setupCMakeSymbolsHash()
handleProjectTargets(cmakeFile, func); handleProjectTargets(cmakeFile, func);
handleFindPackageVariables(cmakeFile, func); handleFindPackageVariables(cmakeFile, func);
handleDotCMakeFiles(cmakeFile); handleDotCMakeFiles(cmakeFile);
handleFindPackageCMakeFiles(cmakeFile);
} }
} }

View File

@@ -124,6 +124,7 @@ public:
QStringList projectImportedTargets() const { return m_projectImportedTargets; } QStringList projectImportedTargets() const { return m_projectImportedTargets; }
QStringList projectFindPackageVariables() const { return m_projectFindPackageVariables; } QStringList projectFindPackageVariables() const { return m_projectFindPackageVariables; }
const QHash<QString, Utils::Link> &dotCMakeFilesHash() const { return m_dotCMakeFilesHash; } const QHash<QString, Utils::Link> &dotCMakeFilesHash() const { return m_dotCMakeFilesHash; }
const QHash<QString, Utils::Link> &findPackagesFilesHash() const { return m_findPackagesFilesHash; }
signals: signals:
void configurationCleared(); void configurationCleared();
@@ -230,6 +231,7 @@ private:
QSet<CMakeFileInfo> m_cmakeFiles; QSet<CMakeFileInfo> m_cmakeFiles;
QHash<QString, Utils::Link> m_cmakeSymbolsHash; QHash<QString, Utils::Link> m_cmakeSymbolsHash;
QHash<QString, Utils::Link> m_dotCMakeFilesHash; QHash<QString, Utils::Link> m_dotCMakeFilesHash;
QHash<QString, Utils::Link> m_findPackagesFilesHash;
CMakeKeywords m_projectKeywords; CMakeKeywords m_projectKeywords;
QStringList m_projectImportedTargets; QStringList m_projectImportedTargets;
QStringList m_projectFindPackageVariables; QStringList m_projectFindPackageVariables;

View File

@@ -338,19 +338,29 @@ void CMakeEditorWidget::findLinkAt(const QTextCursor &cursor,
return processLinkCallback(link); return processLinkCallback(link);
} }
// Handle include(CMakeFileWithoutSuffix) // Handle include(CMakeFileWithoutSuffix) and find_package(Package)
QString functionName; QString functionName;
if (funcStart > funcEnd) { if (funcStart > funcEnd) {
int funcStartPos = findWordStart(funcStart); int funcStartPos = findWordStart(funcStart);
functionName = textDocument()->textAt(funcStartPos, funcStart - funcStartPos); 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); addTextStartEndToLink(link);
return processLinkCallback(link); return processLinkCallback(link);
} }
} }
} }
} }
}
// TODO: Resolve more variables // TODO: Resolve more variables
// Resolve local variables and functions // Resolve local variables and functions