aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2021-10-21 09:13:03 +0200
committerEike Ziller <eike.ziller@qt.io>2021-10-21 09:13:03 +0200
commitbb9774de92dd2c8da85c5231ca5646b078cb42a3 (patch)
treee43470cf6f3a7c965b7dc8a349593dadd03ee65e /src/plugins/cmakeprojectmanager/fileapidataextractor.cpp
parentf41bebc843a8b4ab1ab29562ba200b032b5ab5ac (diff)
parent5377253612801b2f92e0b55e40c3ce0dd2574b09 (diff)
Merge remote-tracking branch 'origin/6.0'
Conflicts: cmake/QtCreatorIDEBranding.cmake qbs/modules/qtc/qtc.qbs qtcreator_ide_branding.pri Change-Id: If8baed5564470e550a0ba5c7720915217eec2412
Diffstat (limited to 'src/plugins/cmakeprojectmanager/fileapidataextractor.cpp')
-rw-r--r--src/plugins/cmakeprojectmanager/fileapidataextractor.cpp75
1 files changed, 51 insertions, 24 deletions
diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp
index cabac0b3b9..d5836605f4 100644
--- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp
+++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp
@@ -28,9 +28,10 @@
#include "fileapiparser.h"
#include "projecttreehelper.h"
-#include <cppeditor/cppprojectfilecategorizer.h>
+#include <cppeditor/cppeditorconstants.h>
#include <utils/algorithm.h>
+#include <utils/mimetypes/mimedatabase.h>
#include <utils/qtcassert.h>
#include <utils/qtcprocess.h>
#include <utils/utilsicons.h>
@@ -336,16 +337,6 @@ RawProjectParts generateRawProjectParts(const PreprocessedData &input,
int counter = 0;
for (const TargetDetails &t : input.targetDetails) {
QDir sourceDir(sourceDirectory.toString());
-
- // Do not tread generated files and CMake precompiled headers as project files
- const auto sourceFiles = Utils::filtered(t.sources, [buildDirectory](const SourceInfo &si) {
- return !si.isGenerated && !isPchFile(buildDirectory, FilePath::fromString(si.path));
- });
- CppEditor::ProjectFileCategorizer
- categorizer({}, transform<QList>(sourceFiles, [&sourceDir](const SourceInfo &si) {
- return sourceDir.absoluteFilePath(si.path);
- }));
-
bool needPostfix = t.compileGroups.size() > 1;
int count = 1;
for (const CompileInfo &ci : t.compileGroups) {
@@ -387,20 +378,45 @@ RawProjectParts generateRawProjectParts(const PreprocessedData &input,
QStringList fragments = splitFragments(ci.fragments);
+ // Get all sources from the compiler group, except generated sources
+ QStringList sources;
+ for (auto idx: ci.sources) {
+ SourceInfo si = t.sources.at(idx);
+ if (si.isGenerated)
+ continue;
+ sources.push_back(sourceDir.absoluteFilePath(si.path));
+ }
+
+ // If we are not in a pch compiler group, add all the headers that are not generated
+ const bool hasPchSource = anyOf(sources, [buildDirectory](const QString &path) {
+ return isPchFile(buildDirectory, FilePath::fromString(path));
+ });
+ if (!hasPchSource) {
+ QString headerMimeType;
+ if (ci.language == "C")
+ headerMimeType = CppEditor::Constants::C_HEADER_MIMETYPE;
+ else if (ci.language == "CXX")
+ headerMimeType = CppEditor::Constants::CPP_HEADER_MIMETYPE;
+
+ for (const SourceInfo &si : t.sources) {
+ if (si.isGenerated)
+ continue;
+ const auto mimeTypes = Utils::mimeTypesForFileName(si.path);
+ for (auto mime : mimeTypes)
+ if (mime.name() == headerMimeType)
+ sources.push_back(sourceDir.absoluteFilePath(si.path));
+ }
+ }
+
+ // Set project files except pch files
+ rpp.setFiles(Utils::filtered(sources, [buildDirectory](const QString &path) {
+ return !isPchFile(buildDirectory, FilePath::fromString(path));
+ }));
+
FilePath precompiled_header
= FilePath::fromString(findOrDefault(t.sources, [&ending](const SourceInfo &si) {
return si.path.endsWith(ending);
}).path);
-
- CppEditor::ProjectFiles sources;
- if (ci.language == "C")
- sources = categorizer.cSources();
- else if (ci.language == "CXX")
- sources = categorizer.cxxSources();
-
- rpp.setFiles(transform<QList>(sources, [](const CppEditor::ProjectFile &pf) {
- return pf.path;
- }));
if (!precompiled_header.isEmpty()) {
if (precompiled_header.toFileInfo().isRelative()) {
const FilePath parentDir = FilePath::fromString(sourceDir.absolutePath());
@@ -595,9 +611,20 @@ void addTargets(const QHash<Utils::FilePath, ProjectExplorer::ProjectNode *> &cm
const FilePath &sourceDir,
const FilePath &buildDir)
{
+ QHash<QString, const TargetDetails *> targetDetailsHash;
+ for (const TargetDetails &t : targetDetails)
+ targetDetailsHash.insert(t.id, &t);
+ const TargetDetails defaultTargetDetails;
+ auto getTargetDetails = [&targetDetailsHash, &defaultTargetDetails](const QString &id)
+ -> const TargetDetails & {
+ auto it = targetDetailsHash.constFind(id);
+ if (it != targetDetailsHash.constEnd())
+ return *it.value();
+ return defaultTargetDetails;
+ };
+
for (const FileApiDetails::Target &t : config.targets) {
- const TargetDetails &td = Utils::findOrDefault(targetDetails,
- Utils::equal(&TargetDetails::id, t.id));
+ const TargetDetails &td = getTargetDetails(t.id);
const FilePath dir = directorySourceDir(config, sourceDir, t.directory);
@@ -730,7 +757,7 @@ FileApiQtcData extractData(FileApiData &input,
result.projectParts = generateRawProjectParts(data, sourceDirectory, buildDirectory);
auto rootProjectNode = generateRootProjectNode(data, sourceDirectory, buildDirectory);
- ProjectTree::applyTreeManager(rootProjectNode.get()); // QRC nodes
+ ProjectTree::applyTreeManager(rootProjectNode.get(), ProjectTree::AsyncPhase); // QRC nodes
result.rootProjectNode = std::move(rootProjectNode);
setupLocationInfoForTargets(result.rootProjectNode.get(), result.buildTargets);