From ef4e27ceb0a84dae63a72e8202e07916b693fe6a Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 15 Apr 2024 09:35:03 +0200 Subject: [PATCH] FileLister: generate a list of `PathWithDetails` --- Makefile | 8 ++++---- cli/cmdlineparser.cpp | 16 ++++++++-------- cli/cmdlineparser.h | 4 ++-- cli/cppcheckexecutor.cpp | 10 +++++----- cli/cppcheckexecutor.h | 5 +++-- cli/executor.cpp | 2 +- cli/executor.h | 5 +++-- cli/filelister.cpp | 19 ++++++++++--------- cli/filelister.h | 7 ++++--- cli/processexecutor.cpp | 20 ++++++++++---------- cli/processexecutor.h | 3 ++- cli/singleexecutor.cpp | 12 ++++++------ cli/singleexecutor.h | 3 ++- cli/threadexecutor.cpp | 16 ++++++++-------- cli/threadexecutor.h | 3 ++- gui/checkthread.cpp | 4 ++-- lib/cppcheck.cpp | 10 +++++----- lib/cppcheck.h | 7 ++++--- lib/filesettings.h | 13 +++++++++++-- test/helpers.cpp | 5 +++-- test/testfilelister.cpp | 15 ++++++++------- test/testfilesettings.cpp | 10 ++++++++++ test/testprocessexecutor.cpp | 6 +++--- test/testsingleexecutor.cpp | 6 +++--- test/testsuppressions.cpp | 14 +++++++------- test/testthreadexecutor.cpp | 6 +++--- tools/dmake/dmake.cpp | 9 +++++---- 27 files changed, 134 insertions(+), 104 deletions(-) diff --git a/Makefile b/Makefile index c35d69a0afe8..0f039a3f1120 100644 --- a/Makefile +++ b/Makefile @@ -661,7 +661,7 @@ cli/cppcheckexecutorseh.o: cli/cppcheckexecutorseh.cpp cli/cppcheckexecutor.h cl cli/executor.o: cli/executor.cpp cli/executor.h lib/addoninfo.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/executor.cpp -cli/filelister.o: cli/filelister.cpp cli/filelister.h lib/config.h lib/path.h lib/pathmatch.h lib/standards.h lib/utils.h +cli/filelister.o: cli/filelister.cpp cli/filelister.h lib/config.h lib/filesettings.h lib/path.h lib/pathmatch.h lib/platform.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/filelister.cpp cli/main.o: cli/main.cpp cli/cppcheckexecutor.h lib/config.h lib/errortypes.h lib/filesettings.h lib/platform.h lib/standards.h lib/utils.h @@ -685,7 +685,7 @@ cli/threadexecutor.o: cli/threadexecutor.cpp cli/executor.h cli/threadexecutor.h test/fixture.o: test/fixture.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h lib/xml.h test/fixture.h test/options.h test/redirect.h $(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/fixture.cpp -test/helpers.o: test/helpers.cpp cli/filelister.h externals/simplecpp/simplecpp.h lib/addoninfo.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/helpers.h +test/helpers.o: test/helpers.cpp cli/filelister.h externals/simplecpp/simplecpp.h lib/addoninfo.h lib/config.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/helpers.cpp test/main.o: test/main.cpp externals/simplecpp/simplecpp.h lib/addoninfo.h lib/check.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h test/fixture.h test/options.h @@ -751,7 +751,7 @@ test/testerrorlogger.o: test/testerrorlogger.cpp externals/tinyxml2/tinyxml2.h l test/testexceptionsafety.o: test/testexceptionsafety.cpp lib/addoninfo.h lib/check.h lib/checkexceptionsafety.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h $(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testexceptionsafety.cpp -test/testfilelister.o: test/testfilelister.cpp cli/filelister.h lib/addoninfo.h lib/check.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h test/fixture.h +test/testfilelister.o: test/testfilelister.cpp cli/filelister.h lib/addoninfo.h lib/check.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h test/fixture.h $(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testfilelister.cpp test/testfilesettings.o: test/testfilesettings.cpp lib/addoninfo.h lib/check.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h test/fixture.h @@ -901,6 +901,6 @@ externals/simplecpp/simplecpp.o: externals/simplecpp/simplecpp.cpp externals/sim externals/tinyxml2/tinyxml2.o: externals/tinyxml2/tinyxml2.cpp externals/tinyxml2/tinyxml2.h $(CXX) $(CPPFLAGS) $(CXXFLAGS) -w -c -o $@ externals/tinyxml2/tinyxml2.cpp -tools/dmake/dmake.o: tools/dmake/dmake.cpp cli/filelister.h lib/config.h lib/pathmatch.h lib/utils.h +tools/dmake/dmake.o: tools/dmake/dmake.cpp cli/filelister.h lib/config.h lib/filesettings.h lib/pathmatch.h lib/platform.h lib/standards.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ tools/dmake/dmake.cpp diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index b85d0f84ede6..82ad14135d04 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -233,7 +233,7 @@ bool CmdLineParser::fillSettingsFromArgs(int argc, const char* const argv[]) } if (!pathnamesRef.empty()) { - std::list> filesResolved; + std::list filesResolved; // TODO: this needs to be inlined into PathMatch as it depends on the underlying filesystem #if defined(_WIN32) // For Windows we want case-insensitive path matching @@ -264,19 +264,19 @@ bool CmdLineParser::fillSettingsFromArgs(int argc, const char* const argv[]) { auto it = filesResolved.begin(); while (it != filesResolved.end()) { - const std::string& name = it->first; + const std::string& name = it->path(); // TODO: log if duplicated files were dropped - filesResolved.erase(std::remove_if(std::next(it), filesResolved.end(), [&](const std::pair& entry) { - return entry.first == name; + filesResolved.erase(std::remove_if(std::next(it), filesResolved.end(), [&](const decltype(filesResolved)::value_type& entry) { + return entry.path() == name; }), filesResolved.end()); ++it; } } - std::list> files; + std::list files; if (!mSettings.fileFilters.empty()) { std::copy_if(filesResolved.cbegin(), filesResolved.cend(), std::inserter(files, files.end()), [&](const decltype(filesResolved)::value_type& entry) { - return matchglobs(mSettings.fileFilters, entry.first); + return matchglobs(mSettings.fileFilters, entry.path()); }); if (files.empty()) { mLogger.printError("could not find any files matching the filter."); @@ -289,11 +289,11 @@ bool CmdLineParser::fillSettingsFromArgs(int argc, const char* const argv[]) // sort the markup last std::copy_if(files.cbegin(), files.cend(), std::inserter(mFiles, mFiles.end()), [&](const decltype(files)::value_type& entry) { - return !mSettings.library.markupFile(entry.first) || !mSettings.library.processMarkupAfterCode(entry.first); + return !mSettings.library.markupFile(entry.path()) || !mSettings.library.processMarkupAfterCode(entry.path()); }); std::copy_if(files.cbegin(), files.cend(), std::inserter(mFiles, mFiles.end()), [&](const decltype(files)::value_type& entry) { - return mSettings.library.markupFile(entry.first) && mSettings.library.processMarkupAfterCode(entry.first); + return mSettings.library.markupFile(entry.path()) && mSettings.library.processMarkupAfterCode(entry.path()); }); if (mFiles.empty()) { diff --git a/cli/cmdlineparser.h b/cli/cmdlineparser.h index 6f3a2738932c..e72a177ac102 100644 --- a/cli/cmdlineparser.h +++ b/cli/cmdlineparser.h @@ -84,7 +84,7 @@ class CmdLineParser { /** * Return the files user gave to command line. */ - const std::list>& getFiles() const { + const std::list& getFiles() const { return mFiles; } @@ -159,7 +159,7 @@ class CmdLineParser { CmdLineLogger &mLogger; std::vector mPathNames; - std::list> mFiles; + std::list mFiles; std::list mFileSettings; std::vector mIgnoredPaths; Settings &mSettings; diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index d1407fe77994..6a9708b1cf37 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -218,7 +218,7 @@ int CppCheckExecutor::check_wrapper(const Settings& settings) return check_internal(settings); } -bool CppCheckExecutor::reportSuppressions(const Settings &settings, const SuppressionList& suppressions, bool unusedFunctionCheckEnabled, const std::list> &files, const std::list& fileSettings, ErrorLogger& errorLogger) { +bool CppCheckExecutor::reportSuppressions(const Settings &settings, const SuppressionList& suppressions, bool unusedFunctionCheckEnabled, const std::list &files, const std::list& fileSettings, ErrorLogger& errorLogger) { const auto& suppr = suppressions.getSuppressions(); if (std::any_of(suppr.begin(), suppr.end(), [](const SuppressionList::Suppression& s) { return s.errorId == "unmatchedSuppression" && s.fileName.empty() && s.lineNumber == SuppressionList::Suppression::NO_LINE; @@ -230,9 +230,9 @@ bool CppCheckExecutor::reportSuppressions(const Settings &settings, const Suppre // the two inputs may only be used exclusively assert(!(!files.empty() && !fileSettings.empty())); - for (std::list>::const_iterator i = files.cbegin(); i != files.cend(); ++i) { + for (std::list::const_iterator i = files.cbegin(); i != files.cend(); ++i) { err |= SuppressionList::reportUnmatchedSuppressions( - suppressions.getUnmatchedLocalSuppressions(i->first, unusedFunctionCheckEnabled), errorLogger); + suppressions.getUnmatchedLocalSuppressions(i->path(), unusedFunctionCheckEnabled), errorLogger); } for (std::list::const_iterator i = fileSettings.cbegin(); i != fileSettings.cend(); ++i) { @@ -260,8 +260,8 @@ int CppCheckExecutor::check_internal(const Settings& settings) const if (!settings.buildDir.empty()) { std::list fileNames; - for (std::list>::const_iterator i = mFiles.cbegin(); i != mFiles.cend(); ++i) - fileNames.emplace_back(i->first); + for (std::list::const_iterator i = mFiles.cbegin(); i != mFiles.cend(); ++i) + fileNames.emplace_back(i->path()); AnalyzerInformation::writeFilesTxt(settings.buildDir, fileNames, settings.userDefines, mFileSettings); } diff --git a/cli/cppcheckexecutor.h b/cli/cppcheckexecutor.h index 0dcdddc598fa..1770de94d584 100644 --- a/cli/cppcheckexecutor.h +++ b/cli/cppcheckexecutor.h @@ -31,6 +31,7 @@ class Settings; class ErrorLogger; class SuppressionList; +class PathWithDetails; /** * This class works as an example of how CppCheck can be used in external @@ -81,7 +82,7 @@ class CppCheckExecutor { protected: - static bool reportSuppressions(const Settings &settings, const SuppressionList& suppressions, bool unusedFunctionCheckEnabled, const std::list> &files, const std::list& fileSettings, ErrorLogger& errorLogger); + static bool reportSuppressions(const Settings &settings, const SuppressionList& suppressions, bool unusedFunctionCheckEnabled, const std::list &files, const std::list& fileSettings, ErrorLogger& errorLogger); /** * Wrapper around check_internal @@ -106,7 +107,7 @@ class CppCheckExecutor { /** * Filename associated with size of file */ - std::list> mFiles; + std::list mFiles; std::list mFileSettings; diff --git a/cli/executor.cpp b/cli/executor.cpp index 8b8d82327309..d435076d60bc 100644 --- a/cli/executor.cpp +++ b/cli/executor.cpp @@ -30,7 +30,7 @@ struct FileSettings; -Executor::Executor(const std::list> &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger) +Executor::Executor(const std::list &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger) : mFiles(files), mFileSettings(fileSettings), mSettings(settings), mSuppressions(suppressions), mErrorLogger(errorLogger) { // the two inputs may only be used exclusively diff --git a/cli/executor.h b/cli/executor.h index 705559eaf49d..0b48b605dc73 100644 --- a/cli/executor.h +++ b/cli/executor.h @@ -31,6 +31,7 @@ class ErrorLogger; class ErrorMessage; class SuppressionList; struct FileSettings; +class PathWithDetails; /// @addtogroup CLI /// @{ @@ -41,7 +42,7 @@ struct FileSettings; */ class Executor { public: - Executor(const std::list> &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger); + Executor(const std::list &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger); virtual ~Executor() = default; Executor(const Executor &) = delete; @@ -67,7 +68,7 @@ class Executor { */ bool hasToLog(const ErrorMessage &msg); - const std::list> &mFiles; + const std::list &mFiles; const std::list& mFileSettings; const Settings &mSettings; SuppressionList &mSuppressions; diff --git a/cli/filelister.cpp b/cli/filelister.cpp index 1f94ea77f57d..697fc54266e1 100644 --- a/cli/filelister.cpp +++ b/cli/filelister.cpp @@ -18,6 +18,7 @@ #include "filelister.h" +#include "filesettings.h" #include "path.h" #include "pathmatch.h" #include "utils.h" @@ -40,12 +41,12 @@ // When compiling Unicode targets WinAPI automatically uses *W Unicode versions // of called functions. Thus, we explicitly call *A versions of the functions. -std::string FileLister::recursiveAddFiles(std::list>&files, const std::string &path, const std::set &extra, const PathMatch& ignored) +std::string FileLister::recursiveAddFiles(std::list&files, const std::string &path, const std::set &extra, const PathMatch& ignored) { return addFiles(files, path, extra, true, ignored); } -std::string FileLister::addFiles(std::list>&files, const std::string &path, const std::set &extra, bool recursive, const PathMatch& ignored) +std::string FileLister::addFiles(std::list&files, const std::string &path, const std::set &extra, bool recursive, const PathMatch& ignored) { if (path.empty()) return "no path specified"; @@ -122,7 +123,7 @@ std::string FileLister::addFiles(std::list>& // Directory if (recursive) { if (!ignored.match(fname)) { - std::list> filesSorted; + std::list filesSorted; std::string err = FileLister::recursiveAddFiles(filesSorted, fname, extra, ignored); if (!err.empty()) @@ -130,7 +131,7 @@ std::string FileLister::addFiles(std::list>& // files inside directories need to be sorted as the filesystem doesn't provide a stable order filesSorted.sort([](const decltype(filesSorted)::value_type& a, const decltype(filesSorted)::value_type& b) { - return a.first < b.first; + return a.path() < b.path(); }); files.insert(files.end(), std::make_move_iterator(filesSorted.begin()), std::make_move_iterator(filesSorted.end())); @@ -165,7 +166,7 @@ std::string FileLister::addFiles(std::list>& #include #include -static std::string addFiles2(std::list> &files, +static std::string addFiles2(std::list &files, const std::string &path, const std::set &extra, bool recursive, @@ -188,7 +189,7 @@ static std::string addFiles2(std::list> &fil std::string new_path = path; new_path += '/'; - std::list> filesSorted; + std::list filesSorted; while (const dirent* dir_result = readdir(dir)) { if ((std::strcmp(dir_result->d_name, ".") == 0) || @@ -225,7 +226,7 @@ static std::string addFiles2(std::list> &fil // files inside directories need to be sorted as the filesystem doesn't provide a stable order filesSorted.sort([](const decltype(filesSorted)::value_type& a, const decltype(filesSorted)::value_type& b) { - return a.first < b.first; + return a.path() < b.path(); }); files.insert(files.end(), std::make_move_iterator(filesSorted.begin()), std::make_move_iterator(filesSorted.end())); @@ -235,12 +236,12 @@ static std::string addFiles2(std::list> &fil return ""; } -std::string FileLister::recursiveAddFiles(std::list> &files, const std::string &path, const std::set &extra, const PathMatch& ignored) +std::string FileLister::recursiveAddFiles(std::list &files, const std::string &path, const std::set &extra, const PathMatch& ignored) { return addFiles(files, path, extra, true, ignored); } -std::string FileLister::addFiles(std::list> &files, const std::string &path, const std::set &extra, bool recursive, const PathMatch& ignored) +std::string FileLister::addFiles(std::list &files, const std::string &path, const std::set &extra, bool recursive, const PathMatch& ignored) { if (path.empty()) return "no path specified"; diff --git a/cli/filelister.h b/cli/filelister.h index c17dea3c378e..e26899e2ce6a 100644 --- a/cli/filelister.h +++ b/cli/filelister.h @@ -26,6 +26,7 @@ #include class PathMatch; +class PathWithDetails; /// @addtogroup CLI /// @{ @@ -43,7 +44,7 @@ class FileLister { * @param ignored ignored paths * @return On success, an empty string is returned. On error, a error message is returned. */ - static std::string recursiveAddFiles(std::list> &files, const std::string &path, const PathMatch& ignored) { + static std::string recursiveAddFiles(std::list &files, const std::string &path, const PathMatch& ignored) { const std::set extra; return recursiveAddFiles(files, path, extra, ignored); } @@ -59,7 +60,7 @@ class FileLister { * @param ignored ignored paths * @return On success, an empty string is returned. On error, a error message is returned. */ - static std::string recursiveAddFiles(std::list> &files, const std::string &path, const std::set &extra, const PathMatch& ignored); + static std::string recursiveAddFiles(std::list &files, const std::string &path, const std::set &extra, const PathMatch& ignored); /** * @brief (Recursively) add source files to a map. @@ -73,7 +74,7 @@ class FileLister { * @param ignored ignored paths * @return On success, an empty string is returned. On error, a error message is returned. */ - static std::string addFiles(std::list> &files, const std::string &path, const std::set &extra, bool recursive, const PathMatch& ignored); + static std::string addFiles(std::list &files, const std::string &path, const std::set &extra, bool recursive, const PathMatch& ignored); }; /// @} diff --git a/cli/processexecutor.cpp b/cli/processexecutor.cpp index fa08ba4bd015..fb8e49ba3c38 100644 --- a/cli/processexecutor.cpp +++ b/cli/processexecutor.cpp @@ -63,7 +63,7 @@ enum class Color; using std::memset; -ProcessExecutor::ProcessExecutor(const std::list> &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger, CppCheck::ExecuteCmdFn executeCommand) +ProcessExecutor::ProcessExecutor(const std::list &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger, CppCheck::ExecuteCmdFn executeCommand) : Executor(files, fileSettings, settings, suppressions, errorLogger) , mExecuteCommand(std::move(executeCommand)) { @@ -233,15 +233,15 @@ unsigned int ProcessExecutor::check() unsigned int fileCount = 0; unsigned int result = 0; - const std::size_t totalfilesize = std::accumulate(mFiles.cbegin(), mFiles.cend(), std::size_t(0), [](std::size_t v, const std::pair& p) { - return v + p.second; + const std::size_t totalfilesize = std::accumulate(mFiles.cbegin(), mFiles.cend(), std::size_t(0), [](std::size_t v, const PathWithDetails& p) { + return v + p.size(); }); std::list rpipes; std::map childFile; std::map pipeFile; std::size_t processedsize = 0; - std::list>::const_iterator iFile = mFiles.cbegin(); + std::list::const_iterator iFile = mFiles.cbegin(); std::list::const_iterator iFileSettings = mFileSettings.cbegin(); for (;;) { // Start a new child @@ -286,7 +286,7 @@ unsigned int ProcessExecutor::check() fileChecker.analyseClangTidy(*iFileSettings); } else { // Read file from a file - resultOfCheck = fileChecker.check(iFile->first); + resultOfCheck = fileChecker.check(iFile->path()); // TODO: call analyseClangTidy()? } @@ -301,8 +301,8 @@ unsigned int ProcessExecutor::check() pipeFile[pipes[0]] = iFileSettings->filename() + ' ' + iFileSettings->cfg; ++iFileSettings; } else { - childFile[pid] = iFile->first; - pipeFile[pipes[0]] = iFile->first; + childFile[pid] = iFile->path(); + pipeFile[pipes[0]] = iFile->path(); ++iFile; } } @@ -330,11 +330,11 @@ unsigned int ProcessExecutor::check() std::size_t size = 0; if (p != pipeFile.end()) { pipeFile.erase(p); - const auto fs = std::find_if(mFiles.cbegin(), mFiles.cend(), [&name](const std::pair& entry) { - return entry.first == name; + const auto fs = std::find_if(mFiles.cbegin(), mFiles.cend(), [&name](const PathWithDetails& entry) { + return entry.path() == name; }); if (fs != mFiles.end()) { - size = fs->second; + size = fs->size(); } } diff --git a/cli/processexecutor.h b/cli/processexecutor.h index c7329241fa91..42e1236d4a85 100644 --- a/cli/processexecutor.h +++ b/cli/processexecutor.h @@ -31,6 +31,7 @@ class Settings; class ErrorLogger; class SuppressionList; struct FileSettings; +class PathWithDetails; /// @addtogroup CLI /// @{ @@ -41,7 +42,7 @@ struct FileSettings; */ class ProcessExecutor : public Executor { public: - ProcessExecutor(const std::list> &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger, CppCheck::ExecuteCmdFn executeCommand); + ProcessExecutor(const std::list &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger, CppCheck::ExecuteCmdFn executeCommand); ProcessExecutor(const ProcessExecutor &) = delete; ProcessExecutor& operator=(const ProcessExecutor &) = delete; diff --git a/cli/singleexecutor.cpp b/cli/singleexecutor.cpp index 3a9be7e0f3a2..46ffe8ede20d 100644 --- a/cli/singleexecutor.cpp +++ b/cli/singleexecutor.cpp @@ -30,7 +30,7 @@ class ErrorLogger; -SingleExecutor::SingleExecutor(CppCheck &cppcheck, const std::list> &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger) +SingleExecutor::SingleExecutor(CppCheck &cppcheck, const std::list &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger) : Executor(files, fileSettings, settings, suppressions, errorLogger) , mCppcheck(cppcheck) { @@ -42,16 +42,16 @@ unsigned int SingleExecutor::check() { unsigned int result = 0; - const std::size_t totalfilesize = std::accumulate(mFiles.cbegin(), mFiles.cend(), std::size_t(0), [](std::size_t v, const std::pair& f) { - return v + f.second; + const std::size_t totalfilesize = std::accumulate(mFiles.cbegin(), mFiles.cend(), std::size_t(0), [](std::size_t v, const PathWithDetails& f) { + return v + f.size(); }); std::size_t processedsize = 0; unsigned int c = 0; - for (std::list>::const_iterator i = mFiles.cbegin(); i != mFiles.cend(); ++i) { - result += mCppcheck.check(i->first); - processedsize += i->second; + for (std::list::const_iterator i = mFiles.cbegin(); i != mFiles.cend(); ++i) { + result += mCppcheck.check(i->path()); + processedsize += i->size(); ++c; if (!mSettings.quiet) reportStatus(c, mFiles.size(), processedsize, totalfilesize); diff --git a/cli/singleexecutor.h b/cli/singleexecutor.h index f45ff9028a85..e1db8c5d842d 100644 --- a/cli/singleexecutor.h +++ b/cli/singleexecutor.h @@ -31,11 +31,12 @@ class Settings; class CppCheck; class SuppressionList; struct FileSettings; +class PathWithDetails; class SingleExecutor : public Executor { public: - SingleExecutor(CppCheck &cppcheck, const std::list> &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger); + SingleExecutor(CppCheck &cppcheck, const std::list &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger); SingleExecutor(const SingleExecutor &) = delete; SingleExecutor& operator=(const SingleExecutor &) = delete; diff --git a/cli/threadexecutor.cpp b/cli/threadexecutor.cpp index 9f44d5b1553b..b185ec9ac260 100644 --- a/cli/threadexecutor.cpp +++ b/cli/threadexecutor.cpp @@ -39,7 +39,7 @@ enum class Color; -ThreadExecutor::ThreadExecutor(const std::list> &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger, CppCheck::ExecuteCmdFn executeCommand) +ThreadExecutor::ThreadExecutor(const std::list &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger, CppCheck::ExecuteCmdFn executeCommand) : Executor(files, fileSettings, settings, suppressions, errorLogger) , mExecuteCommand(std::move(executeCommand)) { @@ -81,24 +81,24 @@ class SyncLogForwarder : public ErrorLogger class ThreadData { public: - ThreadData(ThreadExecutor &threadExecutor, ErrorLogger &errorLogger, const Settings &settings, const std::list> &files, const std::list &fileSettings, CppCheck::ExecuteCmdFn executeCommand) + ThreadData(ThreadExecutor &threadExecutor, ErrorLogger &errorLogger, const Settings &settings, const std::list &files, const std::list &fileSettings, CppCheck::ExecuteCmdFn executeCommand) : mFiles(files), mFileSettings(fileSettings), mSettings(settings), mExecuteCommand(std::move(executeCommand)), logForwarder(threadExecutor, errorLogger) { mItNextFile = mFiles.begin(); mItNextFileSettings = mFileSettings.begin(); mTotalFiles = mFiles.size() + mFileSettings.size(); - mTotalFileSize = std::accumulate(mFiles.cbegin(), mFiles.cend(), std::size_t(0), [](std::size_t v, const std::pair& p) { - return v + p.second; + mTotalFileSize = std::accumulate(mFiles.cbegin(), mFiles.cend(), std::size_t(0), [](std::size_t v, const PathWithDetails& p) { + return v + p.size(); }); } bool next(const std::string *&file, const FileSettings *&fs, std::size_t &fileSize) { std::lock_guard l(mFileSync); if (mItNextFile != mFiles.end()) { - file = &mItNextFile->first; + file = &mItNextFile->path(); fs = nullptr; - fileSize = mItNextFile->second; + fileSize = mItNextFile->size(); ++mItNextFile; return true; } @@ -140,8 +140,8 @@ class ThreadData } private: - const std::list> &mFiles; - std::list>::const_iterator mItNextFile; + const std::list &mFiles; + std::list::const_iterator mItNextFile; const std::list &mFileSettings; std::list::const_iterator mItNextFileSettings; diff --git a/cli/threadexecutor.h b/cli/threadexecutor.h index 78b6982f9a3a..ee6da405b2e4 100644 --- a/cli/threadexecutor.h +++ b/cli/threadexecutor.h @@ -31,6 +31,7 @@ class Settings; class ErrorLogger; class SuppressionList; struct FileSettings; +class PathWithDetails; /// @addtogroup CLI /// @{ @@ -43,7 +44,7 @@ class ThreadExecutor : public Executor { friend class SyncLogForwarder; public: - ThreadExecutor(const std::list> &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger, CppCheck::ExecuteCmdFn executeCommand); + ThreadExecutor(const std::list &files, const std::list& fileSettings, const Settings &settings, SuppressionList &suppressions, ErrorLogger &errorLogger, CppCheck::ExecuteCmdFn executeCommand); ThreadExecutor(const ThreadExecutor &) = delete; ThreadExecutor& operator=(const ThreadExecutor &) = delete; diff --git a/gui/checkthread.cpp b/gui/checkthread.cpp index 12ee8b173c06..c585d39833c0 100644 --- a/gui/checkthread.cpp +++ b/gui/checkthread.cpp @@ -111,9 +111,9 @@ void CheckThread::run() if (!mFiles.isEmpty() || mAnalyseWholeProgram) { mAnalyseWholeProgram = false; qDebug() << "Whole program analysis"; - std::list> files2; + std::list files2; std::transform(mFiles.cbegin(), mFiles.cend(), std::back_inserter(files2), [&](const QString& file) { - return std::pair{file.toStdString(), 0}; + return PathWithDetails{file.toStdString(), 0}; }); mCppcheck.analyseWholeProgram(mCppcheck.settings().buildDir, files2, {}); mFiles.clear(); diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index b39f9898412d..86965af04ac5 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -1475,14 +1475,14 @@ void CppCheck::executeAddons(const std::vector& files, const std::s } } -void CppCheck::executeAddonsWholeProgram(const std::list> &files) +void CppCheck::executeAddonsWholeProgram(const std::list &files) { if (mSettings.addons.empty()) return; std::vector ctuInfoFiles; for (const auto &f: files) { - const std::string &dumpFileName = getDumpFileName(mSettings, f.first); + const std::string &dumpFileName = getDumpFileName(mSettings, f.path()); ctuInfoFiles.push_back(getCtuInfoFileName(dumpFileName)); } @@ -1770,7 +1770,7 @@ bool CppCheck::analyseWholeProgram() return errors && (mExitCode > 0); } -void CppCheck::analyseWholeProgram(const std::string &buildDir, const std::list> &files, const std::list& fileSettings) +void CppCheck::analyseWholeProgram(const std::string &buildDir, const std::list &files, const std::list& fileSettings) { executeAddonsWholeProgram(files); // TODO: pass FileSettings if (buildDir.empty()) { @@ -1838,11 +1838,11 @@ void CppCheck::analyseWholeProgram(const std::string &buildDir, const std::list< delete fi; } -void CppCheck::removeCtuInfoFiles(const std::list> &files, const std::list& fileSettings) +void CppCheck::removeCtuInfoFiles(const std::list &files, const std::list& fileSettings) { if (mSettings.buildDir.empty()) { for (const auto& f: files) { - const std::string &dumpFileName = getDumpFileName(mSettings, f.first); + const std::string &dumpFileName = getDumpFileName(mSettings, f.path()); const std::string &ctuInfoFileName = getCtuInfoFileName(dumpFileName); std::remove(ctuInfoFileName.c_str()); } diff --git a/lib/cppcheck.h b/lib/cppcheck.h index abe815377bbf..f0b832bed40e 100644 --- a/lib/cppcheck.h +++ b/lib/cppcheck.h @@ -44,6 +44,7 @@ enum class SHOWTIME_MODES; struct FileSettings; class CheckUnusedFunctions; class Tokenizer; +class PathWithDetails; namespace simplecpp { class TokenList; } @@ -142,10 +143,10 @@ class CPPCHECKLIB CppCheck : ErrorLogger { void analyseClangTidy(const FileSettings &fileSettings); /** analyse whole program use .analyzeinfo files */ - void analyseWholeProgram(const std::string &buildDir, const std::list> &files, const std::list& fileSettings); + void analyseWholeProgram(const std::string &buildDir, const std::list &files, const std::list& fileSettings); /** Remove *.ctu-info files */ - void removeCtuInfoFiles(const std::list>& files, const std::list& fileSettings); // cppcheck-suppress functionConst // has side effects + void removeCtuInfoFiles(const std::list& files, const std::list& fileSettings); // cppcheck-suppress functionConst // has side effects static void resetTimerResults(); static void printTimerResults(SHOWTIME_MODES mode); @@ -192,7 +193,7 @@ class CPPCHECKLIB CppCheck : ErrorLogger { /** * Execute addons */ - void executeAddonsWholeProgram(const std::list> &files); + void executeAddonsWholeProgram(const std::list &files); #ifdef HAVE_RULES /** diff --git a/lib/filesettings.h b/lib/filesettings.h index 57234e4b2bb6..f7262bc6a22f 100644 --- a/lib/filesettings.h +++ b/lib/filesettings.h @@ -30,18 +30,27 @@ class PathWithDetails { public: - PathWithDetails() = default; - explicit PathWithDetails(std::string path) + : PathWithDetails(std::move(path), 0) + {} + + PathWithDetails(std::string path, std::size_t size) : mPath(std::move(path)) + , mSize(size) {} const std::string& path() const { return mPath; } + + std::size_t size() const + { + return mSize; + } private: std::string mPath; + std::size_t mSize; }; /** File settings. Multiple configurations for a file is allowed. */ diff --git a/test/helpers.cpp b/test/helpers.cpp index 51730b444e9f..adb99ee1f4e9 100644 --- a/test/helpers.cpp +++ b/test/helpers.cpp @@ -19,6 +19,7 @@ #include "helpers.h" #include "filelister.h" +#include "filesettings.h" #include "path.h" #include "pathmatch.h" #include "preprocessor.h" @@ -82,14 +83,14 @@ ScopedFile::~ScopedFile() { // TODO: remove all files // TODO: simplify the function call // hack to be able to delete *.plist output files - std::list> files; + std::list files; const std::string res = FileLister::addFiles(files, mPath, {".plist"}, false, PathMatch({})); if (!res.empty()) { std::cout << "ScopedFile(" << mPath + ") - generating file list failed (" << res << ")" << std::endl; } for (const auto &f : files) { - const std::string &file = f.first; + const std::string &file = f.path(); const int rm_f_res = std::remove(file.c_str()); if (rm_f_res != 0) { std::cout << "ScopedFile(" << mPath + ") - could not delete '" << file << "' (" << rm_f_res << ")" << std::endl; diff --git a/test/testfilelister.cpp b/test/testfilelister.cpp index c2adf2438d60..658af7c38bda 100644 --- a/test/testfilelister.cpp +++ b/test/testfilelister.cpp @@ -17,6 +17,7 @@ */ #include "filelister.h" +#include "filesettings.h" #include "path.h" #include "pathmatch.h" #include "fixture.h" @@ -58,7 +59,7 @@ class TestFileLister : public TestFixture { const std::string adddir = findBaseDir() + "."; // Recursively add add files.. - std::list> files; + std::list files; std::vector masks; PathMatch matcher(std::move(masks)); std::string err = FileLister::recursiveAddFiles(files, adddir, matcher); @@ -75,8 +76,8 @@ class TestFileLister : public TestFixture { #endif const auto find_file = [&](const std::string& name) { - return std::find_if(files.cbegin(), files.cend(), [&name](const std::pair& entry) { - return entry.first == name; + return std::find_if(files.cbegin(), files.cend(), [&name](const PathWithDetails& entry) { + return entry.path() == name; }); }; @@ -92,7 +93,7 @@ class TestFileLister : public TestFixture { } void recursiveAddFilesEmptyPath() const { - std::list> files; + std::list files; const std::string err = FileLister::recursiveAddFiles(files, "", PathMatch({})); ASSERT_EQUALS("no path specified", err); } @@ -100,7 +101,7 @@ class TestFileLister : public TestFixture { void excludeFile1() const { const std::string basedir = findBaseDir(); - std::list> files; + std::list files; std::vector ignored{"lib/token.cpp"}; PathMatch matcher(ignored); std::string err = FileLister::recursiveAddFiles(files, basedir + "lib/token.cpp", matcher); @@ -111,13 +112,13 @@ class TestFileLister : public TestFixture { void excludeFile2() const { const std::string basedir = findBaseDir(); - std::list> files; + std::list files; std::vector ignored; PathMatch matcher(ignored); std::string err = FileLister::recursiveAddFiles(files, basedir + "lib/token.cpp", matcher); ASSERT_EQUALS("", err); ASSERT_EQUALS(1, files.size()); - ASSERT_EQUALS(basedir + "lib/token.cpp", files.begin()->first); + ASSERT_EQUALS(basedir + "lib/token.cpp", files.begin()->path()); } // TODO: test errors diff --git a/test/testfilesettings.cpp b/test/testfilesettings.cpp index c9a442b9a216..b9260b8756eb 100644 --- a/test/testfilesettings.cpp +++ b/test/testfilesettings.cpp @@ -32,22 +32,32 @@ class TestFileSettings : public TestFixture { { const PathWithDetails p{"file.cpp"}; ASSERT_EQUALS("file.cpp", p.path()); + ASSERT_EQUALS(0, p.size()); + } + { + const PathWithDetails p{"file.cpp", 123}; + ASSERT_EQUALS("file.cpp", p.path()); + ASSERT_EQUALS(123, p.size()); } { const PathWithDetails p{"in/file.cpp"}; ASSERT_EQUALS("in/file.cpp", p.path()); + ASSERT_EQUALS(0, p.size()); } { const PathWithDetails p{"in\\file.cpp"}; ASSERT_EQUALS("in\\file.cpp", p.path()); + ASSERT_EQUALS(0, p.size()); } { const PathWithDetails p{"in/../file.cpp"}; ASSERT_EQUALS("in/../file.cpp", p.path()); + ASSERT_EQUALS(0, p.size()); } { const PathWithDetails p{"in\\..\\file.cpp"}; ASSERT_EQUALS("in\\..\\file.cpp", p.path()); + ASSERT_EQUALS(0, p.size()); } } }; diff --git a/test/testprocessexecutor.cpp b/test/testprocessexecutor.cpp index 4740f94bd6b7..df1df02f0679 100644 --- a/test/testprocessexecutor.cpp +++ b/test/testprocessexecutor.cpp @@ -68,7 +68,7 @@ class TestProcessExecutorBase : public TestFixture { void check(unsigned int jobs, int files, int result, const std::string &data, const CheckOptions& opt = make_default_obj{}) { std::list fileSettings; - std::list> filelist; + std::list filelist; if (opt.filesList.empty()) { for (int i = 1; i <= files; ++i) { std::string f_s = fprefix() + "_" + std::to_string(i) + ".cpp"; @@ -112,8 +112,8 @@ class TestProcessExecutorBase : public TestFixture { std::vector> scopedfiles; scopedfiles.reserve(filelist.size()); - for (std::list>::const_iterator i = filelist.cbegin(); i != filelist.cend(); ++i) - scopedfiles.emplace_back(new ScopedFile(i->first, data)); + for (std::list::const_iterator i = filelist.cbegin(); i != filelist.cend(); ++i) + scopedfiles.emplace_back(new ScopedFile(i->path(), data)); // clear files list so only fileSettings are used if (useFS) diff --git a/test/testsingleexecutor.cpp b/test/testsingleexecutor.cpp index 68d467a09141..b20817e57264 100644 --- a/test/testsingleexecutor.cpp +++ b/test/testsingleexecutor.cpp @@ -73,7 +73,7 @@ class TestSingleExecutorBase : public TestFixture { void check(int files, int result, const std::string &data, const CheckOptions& opt = make_default_obj{}) { std::list fileSettings; - std::list> filelist; + std::list filelist; if (opt.filesList.empty()) { for (int i = 1; i <= files; ++i) { std::string f_s = fprefix() + "_" + zpad3(i) + ".cpp"; @@ -118,8 +118,8 @@ class TestSingleExecutorBase : public TestFixture { std::vector> scopedfiles; scopedfiles.reserve(filelist.size()); - for (std::list>::const_iterator i = filelist.cbegin(); i != filelist.cend(); ++i) - scopedfiles.emplace_back(new ScopedFile(i->first, data)); + for (std::list::const_iterator i = filelist.cbegin(); i != filelist.cend(); ++i) + scopedfiles.emplace_back(new ScopedFile(i->path(), data)); // clear files list so only fileSettings are used if (useFS) diff --git a/test/testsuppressions.cpp b/test/testsuppressions.cpp index 14638aac7805..d60a0b7b3839 100644 --- a/test/testsuppressions.cpp +++ b/test/testsuppressions.cpp @@ -229,7 +229,7 @@ class TestSuppressions : public TestFixture { unsigned int _checkSuppression(std::map &f, bool useFS, const std::string &suppression = emptyString) { std::list fileSettings; - std::list> filelist; + std::list filelist; for (std::map::const_iterator i = f.cbegin(); i != f.cend(); ++i) { filelist.emplace_back(i->first, i->second.size()); if (useFS) { @@ -279,7 +279,7 @@ class TestSuppressions : public TestFixture { unsigned int _checkSuppressionThreads(const char code[], bool useFS, const std::string &suppression = emptyString) { std::list fileSettings; - std::list> filelist; + std::list filelist; filelist.emplace_back("test.cpp", strlen(code)); if (useFS) { FileSettings fs; @@ -298,8 +298,8 @@ class TestSuppressions : public TestFixture { std::vector> scopedfiles; scopedfiles.reserve(filelist.size()); - for (std::list>::const_iterator i = filelist.cbegin(); i != filelist.cend(); ++i) - scopedfiles.emplace_back(new ScopedFile(i->first, code)); + for (std::list::const_iterator i = filelist.cbegin(); i != filelist.cend(); ++i) + scopedfiles.emplace_back(new ScopedFile(i->path(), code)); // clear files list so only fileSettings are used if (useFS) @@ -325,7 +325,7 @@ class TestSuppressions : public TestFixture { unsigned int _checkSuppressionProcesses(const char code[], bool useFS, const std::string &suppression = emptyString) { std::list fileSettings; - std::list> filelist; + std::list filelist; filelist.emplace_back("test.cpp", strlen(code)); if (useFS) { FileSettings fs; @@ -344,8 +344,8 @@ class TestSuppressions : public TestFixture { std::vector> scopedfiles; scopedfiles.reserve(filelist.size()); - for (std::list>::const_iterator i = filelist.cbegin(); i != filelist.cend(); ++i) - scopedfiles.emplace_back(new ScopedFile(i->first, code)); + for (std::list::const_iterator i = filelist.cbegin(); i != filelist.cend(); ++i) + scopedfiles.emplace_back(new ScopedFile(i->path(), code)); // clear files list so only fileSettings are used if (useFS) diff --git a/test/testthreadexecutor.cpp b/test/testthreadexecutor.cpp index 2d4c5b38b9aa..c5961821c10f 100644 --- a/test/testthreadexecutor.cpp +++ b/test/testthreadexecutor.cpp @@ -68,7 +68,7 @@ class TestThreadExecutorBase : public TestFixture { void check(unsigned int jobs, int files, int result, const std::string &data, const CheckOptions& opt = make_default_obj{}) { std::list fileSettings; - std::list> filelist; + std::list filelist; if (opt.filesList.empty()) { for (int i = 1; i <= files; ++i) { std::string f_s = fprefix() + "_" + std::to_string(i) + ".cpp"; @@ -113,8 +113,8 @@ class TestThreadExecutorBase : public TestFixture { std::vector> scopedfiles; scopedfiles.reserve(filelist.size()); - for (std::list>::const_iterator i = filelist.cbegin(); i != filelist.cend(); ++i) - scopedfiles.emplace_back(new ScopedFile(i->first, data)); + for (std::list::const_iterator i = filelist.cbegin(); i != filelist.cend(); ++i) + scopedfiles.emplace_back(new ScopedFile(i->path(), data)); // clear files list so only fileSettings are used if (useFS) diff --git a/tools/dmake/dmake.cpp b/tools/dmake/dmake.cpp index 6de023f5cea4..3e25552fe7a4 100644 --- a/tools/dmake/dmake.cpp +++ b/tools/dmake/dmake.cpp @@ -33,6 +33,7 @@ #include "config.h" #include "../cli/filelister.h" +#include "../lib/filesettings.h" #include "../lib/pathmatch.h" #include "../lib/utils.h" @@ -159,7 +160,7 @@ static void compilefiles(std::ostream &fout, const std::vector &fil static std::string getCppFiles(std::vector &files, const std::string &path, bool recursive) { - std::list> filelist; + std::list filelist; const std::set extra; const std::vector masks; const PathMatch matcher(masks); @@ -168,9 +169,9 @@ static std::string getCppFiles(std::vector &files, const std::strin return err; // add *.cpp files to the "files" vector.. - for (const std::pair file : filelist) { - if (endsWith(file.first, ".cpp")) - files.push_back(file.first); + for (const auto& file : filelist) { + if (endsWith(file.path(), ".cpp")) + files.push_back(file.path()); } return ""; }