From 820e4f8177dff43c9ddd4735d6a6e4e575cd4f69 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 4 Jan 2019 09:07:55 +0100 Subject: [PATCH] ClangTools/QMake: Stop analyzing files not part of build configuration ...for the qmake project manager. When parsing the project files, remember whether a file was discovered by the exact or cumulative parse. Only files that were discovered by the exact parse are considered "active" and thus part of the build configuration. The others are not offered for selection. Fixes: QTCREATORBUG-16016 Started-by: Oswald Buddenhagen Change-Id: I7a28b4de15e048975d7f0cd737dd8c11f744315b Reviewed-by: Oswald Buddenhagen Reviewed-by: Christian Kandeler --- src/plugins/clangtools/clangtool.cpp | 6 ++- .../cppeditor/cppcodemodelinspectordialog.cpp | 5 +++ .../cpptools/cppcodemodelinspectordumper.cpp | 6 ++- src/plugins/cpptools/cppprojectfile.cpp | 8 ++-- src/plugins/cpptools/cppprojectfile.h | 3 +- .../cpptools/cppprojectfilecategorizer.cpp | 42 +++++++++---------- .../cpptools/cppprojectfilecategorizer.h | 4 +- src/plugins/cpptools/cpprawprojectpart.h | 2 +- src/plugins/qbsprojectmanager/qbsproject.cpp | 3 +- .../qmakeprojectmanager/qmakeparsernodes.cpp | 7 ++-- .../qmakeprojectmanager/qmakeparsernodes.h | 3 +- .../qmakeprojectmanager/qmakeproject.cpp | 10 ++++- 12 files changed, 59 insertions(+), 40 deletions(-) diff --git a/src/plugins/clangtools/clangtool.cpp b/src/plugins/clangtools/clangtool.cpp index da23b619fd1..8ca03b9634b 100644 --- a/src/plugins/clangtools/clangtool.cpp +++ b/src/plugins/clangtools/clangtool.cpp @@ -77,8 +77,10 @@ static FileInfos sortedFileInfos(const QVector &proj if (file.path == CppTools::CppModelManager::configurationFileName()) continue; - if (CppTools::ProjectFile::isSource(file.kind)) { - fileInfos.emplace_back(Utils::FileName::fromString(file.path), file.kind, projectPart); + if (file.active && CppTools::ProjectFile::isSource(file.kind)) { + fileInfos.emplace_back(Utils::FileName::fromString(file.path), + file.kind, + projectPart); } } } diff --git a/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp b/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp index 54ddb528d1c..45e08cce240 100644 --- a/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp +++ b/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp @@ -262,6 +262,11 @@ QVariant ProjectFilesModel::data(const QModelIndex &index, int role) const } else if (column == FilePathColumn) { return m_files.at(row).path; } + } else if (role == Qt::ForegroundRole) { + if (!m_files.at(index.row()).active) { + return QApplication::palette().color(QPalette::ColorGroup::Disabled, + QPalette::ColorRole::Text); + } } return QVariant(); } diff --git a/src/plugins/cpptools/cppcodemodelinspectordumper.cpp b/src/plugins/cpptools/cppcodemodelinspectordumper.cpp index e359f71a05d..efc4f39aaea 100644 --- a/src/plugins/cpptools/cppcodemodelinspectordumper.cpp +++ b/src/plugins/cpptools/cppcodemodelinspectordumper.cpp @@ -515,8 +515,10 @@ void Dumper::dumpProjectInfos( const QList &projectInfos) if (!part->files.isEmpty()) { m_out << i3 << "Files:{{{4\n"; foreach (const ProjectFile &projectFile, part->files) { - m_out << i4 << Utils::toString(projectFile.kind) << ": " << projectFile.path - << "\n"; + m_out << i4 << Utils::toString(projectFile.kind) << ": " << projectFile.path; + if (!projectFile.active) + m_out << " (inactive)"; + m_out << "\n"; } } diff --git a/src/plugins/cpptools/cppprojectfile.cpp b/src/plugins/cpptools/cppprojectfile.cpp index e01d3726c9f..ec9dd31273f 100644 --- a/src/plugins/cpptools/cppprojectfile.cpp +++ b/src/plugins/cpptools/cppprojectfile.cpp @@ -33,16 +33,18 @@ namespace CppTools { -ProjectFile::ProjectFile(const QString &filePath, Kind kind) +ProjectFile::ProjectFile(const QString &filePath, Kind kind, bool active) : path(filePath) , kind(kind) + , active(active) { } bool ProjectFile::operator==(const ProjectFile &other) const { - return path == other.path - && kind == other.kind; + return active == other.active + && kind == other.kind + && path == other.path; } ProjectFile::Kind ProjectFile::classify(const QString &filePath) diff --git a/src/plugins/cpptools/cppprojectfile.h b/src/plugins/cpptools/cppprojectfile.h index 8e9e0ac4083..0519f79baed 100644 --- a/src/plugins/cpptools/cppprojectfile.h +++ b/src/plugins/cpptools/cppprojectfile.h @@ -61,12 +61,13 @@ public: public: ProjectFile() = default; - ProjectFile(const QString &filePath, Kind kind); + ProjectFile(const QString &filePath, Kind kind, bool active = true); bool operator==(const ProjectFile &other) const; QString path; Kind kind = Unclassified; + bool active = true; }; using ProjectFiles = QVector; diff --git a/src/plugins/cpptools/cppprojectfilecategorizer.cpp b/src/plugins/cpptools/cppprojectfilecategorizer.cpp index 063dfd5dbac..d0f49400522 100644 --- a/src/plugins/cpptools/cppprojectfilecategorizer.cpp +++ b/src/plugins/cpptools/cppprojectfilecategorizer.cpp @@ -25,6 +25,8 @@ #include "cppprojectfilecategorizer.h" +#include + namespace CppTools { ProjectFileCategorizer::ProjectFileCategorizer(const QString &projectPartName, @@ -32,7 +34,7 @@ ProjectFileCategorizer::ProjectFileCategorizer(const QString &projectPartName, FileClassifier fileClassifier) : m_partName(projectPartName) { - const QStringList ambiguousHeaders = classifyFiles(filePaths, fileClassifier); + const ProjectFiles ambiguousHeaders = classifyFiles(filePaths, fileClassifier); expandSourcesWithAmbiguousHeaders(ambiguousHeaders); m_partCount = (m_cSources.isEmpty() ? 0 : 1) @@ -50,35 +52,35 @@ QString ProjectFileCategorizer::partName(const QString &languageName) const return m_partName; } -QStringList ProjectFileCategorizer::classifyFiles(const QStringList &filePaths, - FileClassifier fileClassifier) +ProjectFiles ProjectFileCategorizer::classifyFiles(const QStringList &filePaths, + FileClassifier fileClassifier) { - QStringList ambiguousHeaders; + ProjectFiles ambiguousHeaders; foreach (const QString &filePath, filePaths) { - const ProjectFile::Kind kind = fileClassifier + const ProjectFile projectFile = fileClassifier ? fileClassifier(filePath) - : ProjectFile::classify(filePath); + : ProjectFile(filePath, ProjectFile::classify(filePath)); - switch (kind) { + switch (projectFile.kind) { case ProjectFile::AmbiguousHeader: - ambiguousHeaders += filePath; + ambiguousHeaders += projectFile; break; case ProjectFile::CXXSource: case ProjectFile::CXXHeader: - m_cxxSources += ProjectFile(filePath, kind); + m_cxxSources += projectFile; break; case ProjectFile::ObjCXXSource: case ProjectFile::ObjCXXHeader: - m_objcxxSources += ProjectFile(filePath, kind); + m_objcxxSources += projectFile; break; case ProjectFile::CSource: case ProjectFile::CHeader: - m_cSources += ProjectFile(filePath, kind); + m_cSources += projectFile; break; case ProjectFile::ObjCSource: case ProjectFile::ObjCHeader: - m_objcSources += ProjectFile(filePath, kind); + m_objcSources += projectFile; break; default: continue; @@ -88,19 +90,15 @@ QStringList ProjectFileCategorizer::classifyFiles(const QStringList &filePaths, return ambiguousHeaders; } -static ProjectFiles toProjectFilesWithKind(const QStringList &filePaths, - const ProjectFile::Kind kind) +static ProjectFiles toProjectFilesWithKind(const ProjectFiles &ambiguousHeaders, + const ProjectFile::Kind overriddenKind) { - ProjectFiles projectFiles; - projectFiles.reserve(filePaths.size()); - - foreach (const QString &filePath, filePaths) - projectFiles += ProjectFile(filePath, kind); - - return projectFiles; + return Utils::transform(ambiguousHeaders, [overriddenKind](const ProjectFile &projectFile) { + return ProjectFile(projectFile.path, overriddenKind, projectFile.active); + }); } -void ProjectFileCategorizer::expandSourcesWithAmbiguousHeaders(const QStringList &ambiguousHeaders) +void ProjectFileCategorizer::expandSourcesWithAmbiguousHeaders(const ProjectFiles &ambiguousHeaders) { const bool hasC = !m_cSources.isEmpty(); const bool hasCxx = !m_cxxSources.isEmpty(); diff --git a/src/plugins/cpptools/cppprojectfilecategorizer.h b/src/plugins/cpptools/cppprojectfilecategorizer.h index 0d52767876a..cecf2791740 100644 --- a/src/plugins/cpptools/cppprojectfilecategorizer.h +++ b/src/plugins/cpptools/cppprojectfilecategorizer.h @@ -59,8 +59,8 @@ public: QString partName(const QString &languageName) const; private: - QStringList classifyFiles(const QStringList &filePaths, FileClassifier fileClassifier); - void expandSourcesWithAmbiguousHeaders(const QStringList &ambiguousHeaders); + ProjectFiles classifyFiles(const QStringList &filePaths, FileClassifier fileClassifier); + void expandSourcesWithAmbiguousHeaders(const ProjectFiles &ambiguousHeaders); private: QString m_partName; diff --git a/src/plugins/cpptools/cpprawprojectpart.h b/src/plugins/cpptools/cpprawprojectpart.h index e238fa1d818..69d3f53de33 100644 --- a/src/plugins/cpptools/cpprawprojectpart.h +++ b/src/plugins/cpptools/cpprawprojectpart.h @@ -57,7 +57,7 @@ public: void setDisplayName(const QString &displayName); // FileClassifier must be thread-safe. - using FileClassifier = std::function; + using FileClassifier = std::function; void setFiles(const QStringList &files, FileClassifier fileClassifier = FileClassifier()); void setProjectFileLocation(const QString &projectFile, int line = -1, int column = -1); diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 7eb54dccd79..6927cebfc64 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -1061,7 +1061,8 @@ void QbsProject::updateCppCodeModel() rpp.setPreCompiledHeaders(pchFiles.toList()); rpp.setFiles(grp.allFilePaths(), [filePathToSourceArtifact](const QString &filePath) { // Keep this lambda thread-safe! - return cppFileType(filePathToSourceArtifact.value(filePath)); + return CppTools::ProjectFile(filePath, + cppFileType(filePathToSourceArtifact.value(filePath))); }); rpps.append(rpp); diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp index 907bcfa6a55..f4ba5369a5a 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp @@ -1400,12 +1400,13 @@ QmakeEvalResult *QmakeProFile::evaluate(const QmakeEvalInput &input) input.buildDirectory, input.projectDir); result->newVarValues[Variable::CppFlags] = exactReader->values(QLatin1String("QMAKE_CXXFLAGS")); result->newVarValues[Variable::CFlags] = exactReader->values(QLatin1String("QMAKE_CFLAGS")); - result->newVarValues[Variable::Source] = + result->newVarValues[Variable::ExactSource] = fileListForVar(exactSourceFiles, QLatin1String("SOURCES")) + - fileListForVar(cumulativeSourceFiles, QLatin1String("SOURCES")) + fileListForVar(exactSourceFiles, QLatin1String("HEADERS")) + + fileListForVar(exactSourceFiles, QLatin1String("OBJECTIVE_HEADERS")); + result->newVarValues[Variable::CumulativeSource] = + fileListForVar(cumulativeSourceFiles, QLatin1String("SOURCES")) + fileListForVar(cumulativeSourceFiles, QLatin1String("HEADERS")) + - fileListForVar(exactSourceFiles, QLatin1String("OBJECTIVE_HEADERS")) + fileListForVar(cumulativeSourceFiles, QLatin1String("OBJECTIVE_HEADERS")); result->newVarValues[Variable::UiDir] = QStringList() << uiDirPath(exactReader, input.buildDirectory); result->newVarValues[Variable::HeaderExtension] = QStringList() << exactReader->value(QLatin1String("QMAKE_EXT_H")); diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.h b/src/plugins/qmakeprojectmanager/qmakeparsernodes.h index 066a7558d4a..f2bb612b7e1 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.h +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.h @@ -69,7 +69,8 @@ enum class Variable { IncludePath, CppFlags, CFlags, - Source, + ExactSource, + CumulativeSource, ExactResource, CumulativeResource, UiDir, diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 451d952fe84..a104775a471 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -322,7 +322,8 @@ void QmakeProject::updateCppCodeModel() rpp.setHeaderPaths(headerPaths); // Files and generators - QStringList fileList = pro->variableValue(Variable::Source); + const QStringList cumulativeSourceFiles = pro->variableValue(Variable::CumulativeSource); + QStringList fileList = pro->variableValue(Variable::ExactSource) + cumulativeSourceFiles; QList proGenerators = pro->extraCompilers(); foreach (ProjectExplorer::ExtraCompiler *ec, proGenerators) { ec->forEachTarget([&](const Utils::FileName &generatedFile) { @@ -331,7 +332,12 @@ void QmakeProject::updateCppCodeModel() } generators.append(proGenerators); fileList.prepend(CppTools::CppModelManager::configurationFileName()); - rpp.setFiles(fileList); + rpp.setFiles(fileList, [cumulativeSourceFiles](const QString &filePath) { + // Keep this lambda thread-safe! + return CppTools::ProjectFile(filePath, + CppTools::ProjectFile::classify(filePath), + !cumulativeSourceFiles.contains(filePath)); + }); rpps.append(rpp); }