From 69b3d90683f3fbcb297857743ae13d669b8c3840 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 24 Jul 2019 13:42:23 +0200 Subject: [PATCH] CMake: Remember file location of CMake target definitions Make fileapi remember where CMake targets were defined in the CMakeBuildTarget struct. The other readers will just guess at the location based on the source directory of the target. Change-Id: Ia8fa226c548800992ccea64b1d5981d2f3013408 Reviewed-by: Cristian Adam Reviewed-by: Eike Ziller --- .../cmakeprojectmanager/builddirmanager.cpp | 23 +++++++++++++------ .../cmakeprojectmanager/cmakebuildtarget.h | 3 +++ .../fileapidataextractor.cpp | 11 +++++++++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index 5dfce4ab883..90d29576093 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -357,13 +357,22 @@ QList BuildDirManager::takeBuildTargets(QString &errorMessage) QTC_ASSERT(!m_isHandlingError, return result); if (m_reader) { - result.append(Utils::filtered(m_reader->takeBuildTargets(errorMessage), - [](const CMakeBuildTarget &bt) { - return bt.title != CMakeBuildStep::allTarget() - && bt.title != CMakeBuildStep::cleanTarget() - && bt.title != CMakeBuildStep::installTarget() - && bt.title != CMakeBuildStep::testTarget(); - })); + QList readerTargets + = Utils::filtered(m_reader->takeBuildTargets(errorMessage), + [](const CMakeBuildTarget &bt) { + return bt.title != CMakeBuildStep::allTarget() + && bt.title != CMakeBuildStep::cleanTarget() + && bt.title != CMakeBuildStep::installTarget() + && bt.title != CMakeBuildStep::testTarget(); + }); + + // Guess at the target definition position when no details are known + for (CMakeBuildTarget &t : readerTargets) { + if (t.definitionFile.isEmpty()) { + t.definitionFile = t.sourceDirectory.pathAppended("CMakeLists.txt"); + } + } + result.append(readerTargets); } return result; } diff --git a/src/plugins/cmakeprojectmanager/cmakebuildtarget.h b/src/plugins/cmakeprojectmanager/cmakebuildtarget.h index d64bd2b9edd..ad941221289 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildtarget.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildtarget.h @@ -53,6 +53,9 @@ public: Utils::FilePath sourceDirectory; Utils::FilePath makeCommand; + Utils::FilePath definitionFile; + int definitionLine = -1; + // code model QList includeFiles; QStringList compilerOptions; diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index 0af8699c74c..d2c354cfaeb 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -194,6 +194,17 @@ QList generateBuildTargets(const PreprocessedData &input, } ct.sourceDirectory = FilePath::fromString( QDir::cleanPath(sourceDir.absoluteFilePath(t.sourceDir.toString()))); + + if (t.backtrace >= 0) { + const BacktraceNode &node = t.backtraceGraph.nodes[static_cast(t.backtrace)]; + const int fileIndex = node.file; + if (fileIndex >= 0) { + ct.definitionFile = FilePath::fromString(QDir::cleanPath(sourceDir.absoluteFilePath( + t.backtraceGraph.files[static_cast(fileIndex)]))); + ct.definitionLine = node.line; + } + } + return ct; }); return result;