Skip to content

Commit ca6d1aa

Browse files
authored
moved fileSettings out of Settings (cppcheck-opensource#5608)
Moved the `FileSettings` out of the `Settings` and pass them around explicitly. They can never be specified at the same time and are used exclusively. The code hasn't been fully adjusted to reflect this as this is only the refactoring without any functional changes.
1 parent 8b0916c commit ca6d1aa

22 files changed

Lines changed: 213 additions & 181 deletions

Makefile

Lines changed: 109 additions & 109 deletions
Large diffs are not rendered by default.

cli/cmdlineparser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1073,7 +1073,7 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[])
10731073
mPathNames = project.guiProject.pathNames;
10741074

10751075
if (!project.fileSettings.empty())
1076-
mSettings.fileSettings = project.fileSettings;
1076+
mFileSettings = project.fileSettings;
10771077

10781078
// Use paths _pathnames if no base paths for relative path output are given
10791079
if (mSettings.basePaths.empty() && mSettings.relativePaths)

cli/cmdlineparser.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020
#define CMDLINE_PARSER_H
2121

2222
#include <cstddef>
23+
#include <list>
2324
#include <string>
2425
#include <vector>
2526

2627
#include "cmdlinelogger.h"
28+
#include "filesettings.h"
2729
#include "utils.h"
2830

2931
class Settings;
@@ -80,6 +82,13 @@ class CmdLineParser {
8082
return mPathNames;
8183
}
8284

85+
/**
86+
* Return the file settings read from command line.
87+
*/
88+
const std::list<FileSettings>& getFileSettings() const {
89+
return mFileSettings;
90+
}
91+
8392
/**
8493
* Return if we should exit after printing version, help etc.
8594
*/
@@ -124,6 +133,7 @@ class CmdLineParser {
124133
CmdLineLogger &mLogger;
125134

126135
std::vector<std::string> mPathNames;
136+
std::list<FileSettings> mFileSettings;
127137
std::vector<std::string> mIgnoredPaths;
128138
Settings &mSettings;
129139
Suppressions &mSuppressions;

cli/cppcheckexecutor.cpp

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -187,26 +187,27 @@ bool CppCheckExecutor::parseFromArgs(Settings &settings, int argc, const char* c
187187
}
188188

189189
const std::vector<std::string>& pathnames = parser.getPathNames();
190+
const std::list<FileSettings>& fileSettings = parser.getFileSettings();
190191

191192
#if defined(_WIN32)
192193
// For Windows we want case-insensitive path matching
193194
const bool caseSensitive = false;
194195
#else
195196
const bool caseSensitive = true;
196197
#endif
197-
if (!settings.fileSettings.empty() && !settings.fileFilters.empty()) {
198-
// filter only for the selected filenames from all project files
199-
std::list<FileSettings> newList;
200-
201-
const std::list<FileSettings>& fileSettings = settings.fileSettings;
202-
std::copy_if(fileSettings.cbegin(), fileSettings.cend(), std::back_inserter(newList), [&](const FileSettings& fs) {
203-
return matchglobs(settings.fileFilters, fs.filename);
204-
});
205-
if (!newList.empty())
206-
settings.fileSettings = newList;
198+
if (!fileSettings.empty()) {
199+
if (!settings.fileFilters.empty()) {
200+
// filter only for the selected filenames from all project files
201+
std::copy_if(fileSettings.cbegin(), fileSettings.cend(), std::back_inserter(mFileSettings), [&](const FileSettings &fs) {
202+
return matchglobs(settings.fileFilters, fs.filename);
203+
});
204+
if (mFileSettings.empty()) {
205+
logger.printError("could not find any files matching the filter.");
206+
return false;
207+
}
208+
}
207209
else {
208-
logger.printError("could not find any files matching the filter.");
209-
return false;
210+
mFileSettings = fileSettings;
210211
}
211212
} else if (!pathnames.empty()) {
212213
// Execute recursiveAddFiles() to each given file parameter
@@ -220,13 +221,13 @@ bool CppCheckExecutor::parseFromArgs(Settings &settings, int argc, const char* c
220221
}
221222
}
222223

223-
if (mFiles.empty() && settings.fileSettings.empty()) {
224+
if (mFiles.empty() && fileSettings.empty()) {
224225
logger.printError("could not find or open any of the paths given.");
225226
if (!ignored.empty())
226227
logger.printMessage("Maybe all paths were ignored?");
227228
return false;
228229
}
229-
if (!settings.fileFilters.empty() && settings.fileSettings.empty()) {
230+
if (!settings.fileFilters.empty() && fileSettings.empty()) {
230231
std::map<std::string, std::size_t> newMap;
231232
for (std::map<std::string, std::size_t>::const_iterator i = mFiles.cbegin(); i != mFiles.cend(); ++i)
232233
if (matchglobs(settings.fileFilters, i->first)) {
@@ -319,7 +320,7 @@ int CppCheckExecutor::check_internal(CppCheck& cppcheck)
319320
std::list<std::string> fileNames;
320321
for (std::map<std::string, std::size_t>::const_iterator i = mFiles.cbegin(); i != mFiles.cend(); ++i)
321322
fileNames.emplace_back(i->first);
322-
AnalyzerInformation::writeFilesTxt(settings.buildDir, fileNames, settings.userDefines, settings.fileSettings);
323+
AnalyzerInformation::writeFilesTxt(settings.buildDir, fileNames, settings.userDefines, mFileSettings);
323324
}
324325

325326
if (!settings.checkersReportFilename.empty())
@@ -328,18 +329,18 @@ int CppCheckExecutor::check_internal(CppCheck& cppcheck)
328329
unsigned int returnValue = 0;
329330
if (settings.useSingleJob()) {
330331
// Single process
331-
SingleExecutor executor(cppcheck, mFiles, settings, settings.nomsg, *this);
332+
SingleExecutor executor(cppcheck, mFiles, mFileSettings, settings, settings.nomsg, *this);
332333
returnValue = executor.check();
333334
} else {
334335
#if defined(THREADING_MODEL_THREAD)
335-
ThreadExecutor executor(mFiles, settings, settings.nomsg, *this, CppCheckExecutor::executeCommand);
336+
ThreadExecutor executor(mFiles, mFileSettings, settings, settings.nomsg, *this, CppCheckExecutor::executeCommand);
336337
#elif defined(THREADING_MODEL_FORK)
337-
ProcessExecutor executor(mFiles, settings, settings.nomsg, *this, CppCheckExecutor::executeCommand);
338+
ProcessExecutor executor(mFiles, mFileSettings, settings, settings.nomsg, *this, CppCheckExecutor::executeCommand);
338339
#endif
339340
returnValue = executor.check();
340341
}
341342

342-
cppcheck.analyseWholeProgram(settings.buildDir, mFiles);
343+
cppcheck.analyseWholeProgram(settings.buildDir, mFiles, mFileSettings);
343344

344345
if (settings.severity.isEnabled(Severity::information) || settings.checkConfiguration) {
345346
const bool err = reportSuppressions(settings, cppcheck.isUnusedFunctionCheckEnabled(), mFiles, *this);

cli/cppcheckexecutor.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@
2222
#include "color.h"
2323
#include "config.h"
2424
#include "errorlogger.h"
25+
#include "filesettings.h"
2526

2627
#include <cstdio>
2728
#include <ctime>
2829
#include <iosfwd>
30+
#include <list>
2931
#include <map>
3032
#include <set>
3133
#include <string>
@@ -181,6 +183,8 @@ class CppCheckExecutor : public ErrorLogger {
181183
*/
182184
std::map<std::string, std::size_t> mFiles;
183185

186+
std::list<FileSettings> mFileSettings;
187+
184188
/**
185189
* Report progress time
186190
*/

cli/executor.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
#include <sstream> // IWYU pragma: keep
2828
#include <utility>
2929

30-
Executor::Executor(const std::map<std::string, std::size_t> &files, const Settings &settings, Suppressions &suppressions, ErrorLogger &errorLogger)
31-
: mFiles(files), mSettings(settings), mSuppressions(suppressions), mErrorLogger(errorLogger)
30+
struct FileSettings;
31+
32+
Executor::Executor(const std::map<std::string, std::size_t> &files, const std::list<FileSettings>& fileSettings, const Settings &settings, Suppressions &suppressions, ErrorLogger &errorLogger)
33+
: mFiles(files), mFileSettings(fileSettings), mSettings(settings), mSuppressions(suppressions), mErrorLogger(errorLogger)
3234
{}
3335

3436
bool Executor::hasToLog(const ErrorMessage &msg)

cli/executor.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class Settings;
2929
class ErrorLogger;
3030
class ErrorMessage;
3131
class Suppressions;
32+
struct FileSettings;
3233

3334
/// @addtogroup CLI
3435
/// @{
@@ -39,7 +40,7 @@ class Suppressions;
3940
*/
4041
class Executor {
4142
public:
42-
Executor(const std::map<std::string, std::size_t> &files, const Settings &settings, Suppressions &suppressions, ErrorLogger &errorLogger);
43+
Executor(const std::map<std::string, std::size_t> &files, const std::list<FileSettings>& fileSettings, const Settings &settings, Suppressions &suppressions, ErrorLogger &errorLogger);
4344
virtual ~Executor() = default;
4445

4546
Executor(const Executor &) = delete;
@@ -66,6 +67,7 @@ class Executor {
6667
bool hasToLog(const ErrorMessage &msg);
6768

6869
const std::map<std::string, std::size_t> &mFiles;
70+
const std::list<FileSettings>& mFileSettings;
6971
const Settings &mSettings;
7072
Suppressions &mSuppressions;
7173
ErrorLogger &mErrorLogger;

cli/processexecutor.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ enum class Color;
6060
using std::memset;
6161

6262

63-
ProcessExecutor::ProcessExecutor(const std::map<std::string, std::size_t> &files, const Settings &settings, Suppressions &suppressions, ErrorLogger &errorLogger, CppCheck::ExecuteCmdFn executeCommand)
64-
: Executor(files, settings, suppressions, errorLogger)
63+
ProcessExecutor::ProcessExecutor(const std::map<std::string, std::size_t> &files, const std::list<FileSettings>& fileSettings, const Settings &settings, Suppressions &suppressions, ErrorLogger &errorLogger, CppCheck::ExecuteCmdFn executeCommand)
64+
: Executor(files, fileSettings, settings, suppressions, errorLogger)
6565
, mExecuteCommand(std::move(executeCommand))
6666
{
6767
assert(mSettings.jobs > 1);
@@ -237,11 +237,11 @@ unsigned int ProcessExecutor::check()
237237
std::map<int, std::string> pipeFile;
238238
std::size_t processedsize = 0;
239239
std::map<std::string, std::size_t>::const_iterator iFile = mFiles.cbegin();
240-
std::list<FileSettings>::const_iterator iFileSettings = mSettings.fileSettings.cbegin();
240+
std::list<FileSettings>::const_iterator iFileSettings = mFileSettings.cbegin();
241241
for (;;) {
242242
// Start a new child
243243
const size_t nchildren = childFile.size();
244-
if ((iFile != mFiles.cend() || iFileSettings != mSettings.fileSettings.cend()) && nchildren < mSettings.jobs && checkLoadAverage(nchildren)) {
244+
if ((iFile != mFiles.cend() || iFileSettings != mFileSettings.cend()) && nchildren < mSettings.jobs && checkLoadAverage(nchildren)) {
245245
int pipes[2];
246246
if (pipe(pipes) == -1) {
247247
std::cerr << "#### ThreadExecutor::check, pipe() failed: "<< std::strerror(errno) << std::endl;
@@ -275,7 +275,7 @@ unsigned int ProcessExecutor::check()
275275
fileChecker.settings() = mSettings;
276276
unsigned int resultOfCheck = 0;
277277

278-
if (iFileSettings != mSettings.fileSettings.end()) {
278+
if (iFileSettings != mFileSettings.end()) {
279279
resultOfCheck = fileChecker.check(*iFileSettings);
280280
if (fileChecker.settings().clangTidy)
281281
fileChecker.analyseClangTidy(*iFileSettings);
@@ -291,7 +291,7 @@ unsigned int ProcessExecutor::check()
291291

292292
close(pipes[1]);
293293
rpipes.push_back(pipes[0]);
294-
if (iFileSettings != mSettings.fileSettings.end()) {
294+
if (iFileSettings != mFileSettings.end()) {
295295
childFile[pid] = iFileSettings->filename + ' ' + iFileSettings->cfg;
296296
pipeFile[pipes[0]] = iFileSettings->filename + ' ' + iFileSettings->cfg;
297297
++iFileSettings;
@@ -334,7 +334,7 @@ unsigned int ProcessExecutor::check()
334334
fileCount++;
335335
processedsize += size;
336336
if (!mSettings.quiet)
337-
Executor::reportStatus(fileCount, mFiles.size() + mSettings.fileSettings.size(), processedsize, totalfilesize);
337+
Executor::reportStatus(fileCount, mFiles.size() + mFileSettings.size(), processedsize, totalfilesize);
338338

339339
close(*rp);
340340
rp = rpipes.erase(rp);
@@ -370,7 +370,7 @@ unsigned int ProcessExecutor::check()
370370
}
371371
}
372372
}
373-
if (iFile == mFiles.end() && iFileSettings == mSettings.fileSettings.end() && rpipes.empty() && childFile.empty()) {
373+
if (iFile == mFiles.end() && iFileSettings == mFileSettings.end() && rpipes.empty() && childFile.empty()) {
374374
// All done
375375
break;
376376
}

cli/processexecutor.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@
2323
#include "executor.h"
2424

2525
#include <cstddef>
26+
#include <list>
2627
#include <map>
2728
#include <string>
2829

2930
class Settings;
3031
class ErrorLogger;
3132
class Suppressions;
33+
struct FileSettings;
3234

3335
/// @addtogroup CLI
3436
/// @{
@@ -39,7 +41,7 @@ class Suppressions;
3941
*/
4042
class ProcessExecutor : public Executor {
4143
public:
42-
ProcessExecutor(const std::map<std::string, std::size_t> &files, const Settings &settings, Suppressions &suppressions, ErrorLogger &errorLogger, CppCheck::ExecuteCmdFn executeCommand);
44+
ProcessExecutor(const std::map<std::string, std::size_t> &files, const std::list<FileSettings>& fileSettings, const Settings &settings, Suppressions &suppressions, ErrorLogger &errorLogger, CppCheck::ExecuteCmdFn executeCommand);
4345
ProcessExecutor(const ProcessExecutor &) = delete;
4446
void operator=(const ProcessExecutor &) = delete;
4547

cli/singleexecutor.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131

3232
class ErrorLogger;
3333

34-
SingleExecutor::SingleExecutor(CppCheck &cppcheck, const std::map<std::string, std::size_t> &files, const Settings &settings, Suppressions &suppressions, ErrorLogger &errorLogger)
35-
: Executor(files, settings, suppressions, errorLogger)
34+
SingleExecutor::SingleExecutor(CppCheck &cppcheck, const std::map<std::string, std::size_t> &files, const std::list<FileSettings>& fileSettings, const Settings &settings, Suppressions &suppressions, ErrorLogger &errorLogger)
35+
: Executor(files, fileSettings, settings, suppressions, errorLogger)
3636
, mCppcheck(cppcheck)
3737
{
3838
assert(mSettings.jobs == 1);
@@ -51,7 +51,7 @@ unsigned int SingleExecutor::check()
5151
unsigned int c = 0;
5252
// TODO: processes either mSettings.project.fileSettings or mFiles - process/thread implementations process both
5353
// TODO: thread/process implementations process fileSettings first
54-
if (mSettings.fileSettings.empty()) {
54+
if (mFileSettings.empty()) {
5555
for (std::map<std::string, std::size_t>::const_iterator i = mFiles.cbegin(); i != mFiles.cend(); ++i) {
5656
if (!mSettings.library.markupFile(i->first)
5757
|| !mSettings.library.processMarkupAfterCode(i->first)) {
@@ -66,13 +66,13 @@ unsigned int SingleExecutor::check()
6666
} else {
6767
// filesettings
6868
// check all files of the project
69-
for (const FileSettings &fs : mSettings.fileSettings) {
69+
for (const FileSettings &fs : mFileSettings) {
7070
if (!mSettings.library.markupFile(fs.filename)
7171
|| !mSettings.library.processMarkupAfterCode(fs.filename)) {
7272
result += mCppcheck.check(fs);
7373
++c;
7474
if (!mSettings.quiet)
75-
reportStatus(c, mSettings.fileSettings.size(), c, mSettings.fileSettings.size());
75+
reportStatus(c, mFileSettings.size(), c, mFileSettings.size());
7676
if (mSettings.clangTidy)
7777
mCppcheck.analyseClangTidy(fs);
7878
}
@@ -82,7 +82,7 @@ unsigned int SingleExecutor::check()
8282
// second loop to parse all markup files which may not work until all
8383
// c/cpp files have been parsed and checked
8484
// TODO: get rid of duplicated code
85-
if (mSettings.fileSettings.empty()) {
85+
if (mFileSettings.empty()) {
8686
for (std::map<std::string, std::size_t>::const_iterator i = mFiles.cbegin(); i != mFiles.cend(); ++i) {
8787
if (mSettings.library.markupFile(i->first)
8888
&& mSettings.library.processMarkupAfterCode(i->first)) {
@@ -96,13 +96,13 @@ unsigned int SingleExecutor::check()
9696
}
9797
}
9898
else {
99-
for (const FileSettings &fs : mSettings.fileSettings) {
99+
for (const FileSettings &fs : mFileSettings) {
100100
if (mSettings.library.markupFile(fs.filename)
101101
&& mSettings.library.processMarkupAfterCode(fs.filename)) {
102102
result += mCppcheck.check(fs);
103103
++c;
104104
if (!mSettings.quiet)
105-
reportStatus(c, mSettings.fileSettings.size(), c, mSettings.fileSettings.size());
105+
reportStatus(c, mFileSettings.size(), c, mFileSettings.size());
106106
if (mSettings.clangTidy)
107107
mCppcheck.analyseClangTidy(fs);
108108
}

0 commit comments

Comments
 (0)