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 &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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user