From 1d2af6b4cc5e67498a2c26645186eb3ea7e45093 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 3 Jun 2020 10:32:42 +0200 Subject: [PATCH] clang-tidy: Consider context when encountering duplicate files Prefer source files from contexts where we know that they actually get built and thus should have includes and compiler flags properly set up. Also fix the qmake and qbs project managers to not mislabel any non- application products as libraries. Fixes: QTCREATORBUG-23394 Change-Id: I0d122c7b58e12d14d68a1ca7337df83074299cd7 Reviewed-by: Ivan Komissarov --- src/plugins/clangtools/clangtool.cpp | 11 ++++++++++- src/plugins/qbsprojectmanager/qbsproject.cpp | 14 +++++++++++--- src/plugins/qmakeprojectmanager/qmakeproject.cpp | 16 ++++++++++++---- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/plugins/clangtools/clangtool.cpp b/src/plugins/clangtools/clangtool.cpp index 6cc636dd87a..bbebc3560f7 100644 --- a/src/plugins/clangtools/clangtool.cpp +++ b/src/plugins/clangtools/clangtool.cpp @@ -351,7 +351,16 @@ static FileInfos sortedFileInfos(const QVector &proj } } - Utils::sort(fileInfos, &FileInfo::file); + Utils::sort(fileInfos, [](const FileInfo &fi1, const FileInfo &fi2) { + if (fi1.file == fi2.file) { + // If the same file appears more than once, prefer contexts where the file is + // built as part of an application or library to those where it may not be, + // e.g. because it is just listed as some sort of resource. + return fi1.projectPart->buildTargetType != BuildTargetType::Unknown + && fi2.projectPart->buildTargetType == BuildTargetType::Unknown; + } + return fi1.file < fi2.file; + }); fileInfos.erase(std::unique(fileInfos.begin(), fileInfos.end()), fileInfos.end()); return fileInfos; diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 4e46e43c686..db8404f1780 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -916,9 +916,17 @@ static RawProjectParts generateProjectParts( location.value("line").toInt(), location.value("column").toInt()); rpp.setBuildSystemTarget(QbsProductNode::getBuildKey(prd)); - rpp.setBuildTargetType(prd.value("is-runnable").toBool() - ? BuildTargetType::Executable - : BuildTargetType::Library); + if (prd.value("is-runnable").toBool()) { + rpp.setBuildTargetType(BuildTargetType::Executable); + } else { + const QJsonArray pType = prd.value("type").toArray(); + if (pType.contains("staticlibrary") || pType.contains("dynamiclibrary") + || pType.contains("loadablemodule")) { + rpp.setBuildTargetType(BuildTargetType::Library); + } else { + rpp.setBuildTargetType(BuildTargetType::Unknown); + } + } rpp.setSelectedForBuilding(grp.value("is-enabled").toBool()); QHash filePathToSourceArtifact; diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 90eeeb8f9b9..8afb8c33b5c 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -290,10 +290,18 @@ void QmakeBuildSystem::updateCppCodeModel() rpp.setDisplayName(pro->displayName()); rpp.setProjectFileLocation(pro->filePath().toString()); rpp.setBuildSystemTarget(pro->filePath().toString()); - const bool isExecutable = pro->projectType() == ProjectType::ApplicationTemplate; - rpp.setBuildTargetType(isExecutable ? ProjectExplorer::BuildTargetType::Executable - : ProjectExplorer::BuildTargetType::Library); - + switch (pro->projectType()) { + case ProjectType::ApplicationTemplate: + rpp.setBuildTargetType(BuildTargetType::Executable); + break; + case ProjectType::SharedLibraryTemplate: + case ProjectType::StaticLibraryTemplate: + rpp.setBuildTargetType(BuildTargetType::Library); + break; + default: + rpp.setBuildTargetType(BuildTargetType::Unknown); + break; + } rpp.setFlagsForCxx({kitInfo.cxxToolChain, pro->variableValue(Variable::CppFlags)}); rpp.setFlagsForC({kitInfo.cToolChain, pro->variableValue(Variable::CFlags)}); rpp.setMacros(ProjectExplorer::Macro::toMacros(pro->cxxDefines()));