diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index b9006711ce1..06921e43253 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -191,7 +191,7 @@ bool CmdLineParser::fillSettingsFromArgs(int argc, const char* const argv[]) } // Output a warning for the user if he tries to exclude headers - const std::vector& ignored = getIgnoredPaths(); + const std::vector& ignored = mIgnoredPaths; const bool warn = std::any_of(ignored.cbegin(), ignored.cend(), [](const std::string& i) { return Path::isHeader(i); }); @@ -200,8 +200,8 @@ bool CmdLineParser::fillSettingsFromArgs(int argc, const char* const argv[]) mLogger.printMessage("Please use --suppress for ignoring results from the header files."); } - const std::vector& pathnamesRef = getPathNames(); - const std::list& fileSettingsRef = getFileSettings(); + const std::vector& pathnamesRef = mPathNames; + const std::list& fileSettingsRef = mFileSettings; // the inputs can only be used exclusively - CmdLineParser should already handle this assert(!(!pathnamesRef.empty() && !fileSettingsRef.empty())); diff --git a/cli/cmdlineparser.h b/cli/cmdlineparser.h index 22e00615701..4a8d94a6b7e 100644 --- a/cli/cmdlineparser.h +++ b/cli/cmdlineparser.h @@ -47,7 +47,6 @@ class Library; * class internal options. */ class CmdLineParser { - friend class TestCmdlineParser; public: /** * The constructor. @@ -80,19 +79,6 @@ class CmdLineParser { static std::list filterFiles(const std::vector& fileFilters, const std::list& filesResolved); - /** - * Parse given command line. - * @return true if command line was ok, false if there was an error. - */ - Result parseFromArgs(int argc, const char* const argv[]); - - /** - * Return the path names user gave to command line. - */ - const std::vector& getPathNames() const { - return mPathNames; - } - /** * Return the files user gave to command line. */ @@ -107,26 +93,24 @@ class CmdLineParser { return mFileSettings; } +protected: /** - * Return a list of paths user wants to ignore. + * Parse given command line. + * @return true if command line was ok, false if there was an error. */ - const std::vector& getIgnoredPaths() const { - return mIgnoredPaths; - } + Result parseFromArgs(int argc, const char* const argv[]); /** * Get Cppcheck version */ std::string getVersion() const; -protected: - +private: /** * Print help text to the console. */ void printHelp() const; -private: bool isCppcheckPremium() const; template @@ -168,19 +152,21 @@ class CmdLineParser { bool loadCppcheckCfg(); + void outputFormatOptionMixingError() const; + CmdLineLogger &mLogger; + Settings &mSettings; + Suppressions &mSuppressions; + +protected: std::vector mPathNames; std::list mFiles; std::list mFileSettings; std::vector mIgnoredPaths; - Settings &mSettings; - Suppressions &mSuppressions; bool mAnalyzeAllVsConfigsSetOnCmdLine = false; /** @brief Name of the language that is enforced. Empty per default. */ Standards::Language mEnforcedLang{Standards::Language::None}; - - void outputFormatOptionMixingError() const; }; /// @} diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp index 9a1fb64279e..9ab7234223a 100644 --- a/test/testcmdlineparser.cpp +++ b/test/testcmdlineparser.cpp @@ -91,16 +91,25 @@ class TestCmdlineParser : public TestFixture { std::string buf; }; + class CmdLineParserTest : public CmdLineParser + { + friend class TestCmdlineParser; + public: + CmdLineParserTest(CmdLineLogger &logger, Settings &settings, Suppressions &suppressions) + : CmdLineParser(logger, settings, suppressions) + {} + }; + std::unique_ptr logger; std::unique_ptr settings; std::unique_ptr supprs; - std::unique_ptr parser; + std::unique_ptr parser; void prepareTestInternal() override { logger.reset(new CmdLineLoggerTest()); settings.reset(new Settings()); supprs.reset(new Suppressions()); - parser.reset(new CmdLineParser(*logger, *settings, *supprs)); + parser.reset(new CmdLineParserTest(*logger, *settings, *supprs)); } void teardownTestInternal() override { @@ -616,23 +625,23 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("file.cpp", parser->getPathNames().at(0)); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("file.cpp", parser->mPathNames[0]); } void onepath() { REDIRECT; const char * const argv[] = {"cppcheck", "src"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("src", parser->getPathNames().at(0)); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("src", parser->mPathNames[0]); } void optionwithoutfile() { REDIRECT; const char * const argv[] = {"cppcheck", "-v"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parseFromArgs(argv)); - ASSERT_EQUALS(0, parser->getPathNames().size()); + ASSERT_EQUALS(0, parser->mPathNames.size()); ASSERT_EQUALS("cppcheck: error: no C or C++ source files found.\n", logger->str()); } @@ -1266,8 +1275,8 @@ class TestCmdlineParser : public TestFixture { "file2.cpp\n"); const char * const argv[] = {"cppcheck", "--file-list=files.txt", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT_EQUALS(3, parser->getPathNames().size()); - auto it = parser->getPathNames().cbegin(); + ASSERT_EQUALS(3, parser->mPathNames.size()); + auto it = parser->mPathNames.cbegin(); ASSERT_EQUALS("file1.c", *it++); ASSERT_EQUALS("file2.cpp", *it++); ASSERT_EQUALS("file.cpp", *it); @@ -1285,8 +1294,8 @@ class TestCmdlineParser : public TestFixture { RedirectInput input("file1.c\nfile2.cpp\n"); const char * const argv[] = {"cppcheck", "--file-list=-", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT_EQUALS(3, parser->getPathNames().size()); - auto it = parser->getPathNames().cbegin(); + ASSERT_EQUALS(3, parser->mPathNames.size()); + auto it = parser->mPathNames.cbegin(); ASSERT_EQUALS("file1.c", *it++); ASSERT_EQUALS("file2.cpp", *it++); ASSERT_EQUALS("file.cpp", *it); @@ -2474,8 +2483,8 @@ class TestCmdlineParser : public TestFixture { ""); const char * const argv[] = {"cppcheck", "--project=project.cppcheck"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT_EQUALS(1, parser->getPathNames().size()); - auto it = parser->getPathNames().cbegin(); + ASSERT_EQUALS(1, parser->mPathNames.size()); + auto it = parser->mPathNames.cbegin(); ASSERT_EQUALS("dir", *it); } @@ -3169,21 +3178,21 @@ class TestCmdlineParser : public TestFixture { void checkHeaders() { REDIRECT; const char * const argv[] = {"cppcheck", "--check-headers", "file.cpp"}; - ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv)); + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); ASSERT_EQUALS(true, settings->checkHeaders); } void noCheckHeaders() { REDIRECT; const char * const argv[] = {"cppcheck", "--no-check-headers", "file.cpp"}; - ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv)); + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); ASSERT_EQUALS(false, settings->checkHeaders); } void noCheckHeaders2() { REDIRECT; const char * const argv[] = {"cppcheck", "--check-headers", "--no-check-headers", "file.cpp"}; - ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv)); + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); ASSERT_EQUALS(false, settings->checkHeaders); } @@ -3201,28 +3210,28 @@ class TestCmdlineParser : public TestFixture { void checkUnusedTemplates() { REDIRECT; const char * const argv[] = {"cppcheck", "--check-unused-templates", "file.cpp"}; - ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv)); + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); ASSERT_EQUALS(true, settings->checkUnusedTemplates); } void noCheckUnusedTemplates() { REDIRECT; const char * const argv[] = {"cppcheck", "--no-check-unused-templates", "file.cpp"}; - ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv)); + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs( argv)); ASSERT_EQUALS(false, settings->checkUnusedTemplates); } void noCheckUnusedTemplates2() { REDIRECT; const char * const argv[] = {"cppcheck", "--check-unused-templates", "--no-check-unused-templates", "file.cpp"}; - ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv)); + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); ASSERT_EQUALS(false, settings->checkUnusedTemplates); } void clangTidy() { REDIRECT; const char * const argv[] = {"cppcheck", "--clang-tidy", "file.cpp"}; - ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv)); + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); ASSERT(settings->clangTidy); ASSERT_EQUALS("clang-tidy", settings->clangTidyExecutable); } @@ -3230,7 +3239,7 @@ class TestCmdlineParser : public TestFixture { void clangTidyCustom() { REDIRECT; const char * const argv[] = {"cppcheck", "--clang-tidy=clang-tidy-14", "file.cpp"}; - ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv)); + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); ASSERT(settings->clangTidy); ASSERT_EQUALS("clang-tidy-14", settings->clangTidyExecutable); } @@ -3342,82 +3351,82 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "-isrc", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT_EQUALS(1, parser->getIgnoredPaths().size()); - ASSERT_EQUALS("src", parser->getIgnoredPaths()[0]); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("file.cpp", parser->getPathNames()[0]); + ASSERT_EQUALS(1, parser->mIgnoredPaths.size()); + ASSERT_EQUALS("src", parser->mIgnoredPaths[0]); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("file.cpp", parser->mPathNames[0]); } void ignorepaths2() { REDIRECT; const char * const argv[] = {"cppcheck", "-i", "src", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT_EQUALS(1, parser->getIgnoredPaths().size()); - ASSERT_EQUALS("src", parser->getIgnoredPaths()[0]); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("file.cpp", parser->getPathNames()[0]); + ASSERT_EQUALS(1, parser->mIgnoredPaths.size()); + ASSERT_EQUALS("src", parser->mIgnoredPaths[0]); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("file.cpp", parser->mPathNames[0]); } void ignorepaths3() { REDIRECT; const char * const argv[] = {"cppcheck", "-isrc", "-imodule", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT_EQUALS(2, parser->getIgnoredPaths().size()); - ASSERT_EQUALS("src", parser->getIgnoredPaths()[0]); - ASSERT_EQUALS("module", parser->getIgnoredPaths()[1]); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("file.cpp", parser->getPathNames()[0]); + ASSERT_EQUALS(2, parser->mIgnoredPaths.size()); + ASSERT_EQUALS("src", parser->mIgnoredPaths[0]); + ASSERT_EQUALS("module", parser->mIgnoredPaths[1]); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("file.cpp", parser->mPathNames[0]); } void ignorepaths4() { REDIRECT; const char * const argv[] = {"cppcheck", "-i", "src", "-i", "module", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT_EQUALS(2, parser->getIgnoredPaths().size()); - ASSERT_EQUALS("src", parser->getIgnoredPaths()[0]); - ASSERT_EQUALS("module", parser->getIgnoredPaths()[1]); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("file.cpp", parser->getPathNames()[0]); + ASSERT_EQUALS(2, parser->mIgnoredPaths.size()); + ASSERT_EQUALS("src", parser->mIgnoredPaths[0]); + ASSERT_EQUALS("module", parser->mIgnoredPaths[1]); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("file.cpp", parser->mPathNames[0]); } void ignorefilepaths1() { REDIRECT; const char * const argv[] = {"cppcheck", "-ifoo.cpp", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT_EQUALS(1, parser->getIgnoredPaths().size()); - ASSERT_EQUALS("foo.cpp", parser->getIgnoredPaths()[0]); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("file.cpp", parser->getPathNames()[0]); + ASSERT_EQUALS(1, parser->mIgnoredPaths.size()); + ASSERT_EQUALS("foo.cpp", parser->mIgnoredPaths[0]); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("file.cpp", parser->mPathNames[0]); } void ignorefilepaths2() { REDIRECT; const char * const argv[] = {"cppcheck", "-isrc/foo.cpp", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT_EQUALS(1, parser->getIgnoredPaths().size()); - ASSERT_EQUALS("src/foo.cpp", parser->getIgnoredPaths()[0]); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("file.cpp", parser->getPathNames()[0]); + ASSERT_EQUALS(1, parser->mIgnoredPaths.size()); + ASSERT_EQUALS("src/foo.cpp", parser->mIgnoredPaths[0]); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("file.cpp", parser->mPathNames[0]); } void ignorefilepaths3() { REDIRECT; const char * const argv[] = {"cppcheck", "-i", "foo.cpp", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT_EQUALS(1, parser->getIgnoredPaths().size()); - ASSERT_EQUALS("foo.cpp", parser->getIgnoredPaths()[0]); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("file.cpp", parser->getPathNames()[0]); + ASSERT_EQUALS(1, parser->mIgnoredPaths.size()); + ASSERT_EQUALS("foo.cpp", parser->mIgnoredPaths[0]); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("file.cpp", parser->mPathNames[0]); } void ignorefilepaths4() { REDIRECT; const char * const argv[] = {"cppcheck", "-ifoo.cpp", "file.cpp"}; ASSERT(!fillSettingsFromArgs(argv)); - ASSERT_EQUALS(1, parser->getIgnoredPaths().size()); - ASSERT_EQUALS("foo.cpp", parser->getIgnoredPaths()[0]); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("file.cpp", parser->getPathNames()[0]); + ASSERT_EQUALS(1, parser->mIgnoredPaths.size()); + ASSERT_EQUALS("foo.cpp", parser->mIgnoredPaths[0]); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("file.cpp", parser->mPathNames[0]); TODO_ASSERT_EQUALS("cppcheck: error: could not find or open any of the paths given.\n", "cppcheck: error: could not find or open any of the paths given.\ncppcheck: Maybe all paths were ignored?\n", logger->str()); } @@ -3425,10 +3434,10 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "-ifile.cpp", "file.cpp"}; ASSERT(!fillSettingsFromArgs(argv)); - ASSERT_EQUALS(1, parser->getIgnoredPaths().size()); - ASSERT_EQUALS("file.cpp", parser->getIgnoredPaths()[0]); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("file.cpp", parser->getPathNames()[0]); + ASSERT_EQUALS(1, parser->mIgnoredPaths.size()); + ASSERT_EQUALS("file.cpp", parser->mIgnoredPaths[0]); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("file.cpp", parser->mPathNames[0]); ASSERT_EQUALS("cppcheck: error: could not find or open any of the paths given.\ncppcheck: Maybe all paths were ignored?\n", logger->str()); } @@ -3436,10 +3445,10 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "-isrc/file.cpp", "src/file.cpp"}; ASSERT(!fillSettingsFromArgs(argv)); - ASSERT_EQUALS(1, parser->getIgnoredPaths().size()); - ASSERT_EQUALS("src/file.cpp", parser->getIgnoredPaths()[0]); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("src/file.cpp", parser->getPathNames()[0]); + ASSERT_EQUALS(1, parser->mIgnoredPaths.size()); + ASSERT_EQUALS("src/file.cpp", parser->mIgnoredPaths[0]); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("src/file.cpp", parser->mPathNames[0]); ASSERT_EQUALS("cppcheck: error: could not find or open any of the paths given.\ncppcheck: Maybe all paths were ignored?\n", logger->str()); } @@ -3447,10 +3456,10 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "-isrc\\file.cpp", "src/file.cpp"}; ASSERT(!fillSettingsFromArgs(argv)); - ASSERT_EQUALS(1, parser->getIgnoredPaths().size()); - ASSERT_EQUALS("src/file.cpp", parser->getIgnoredPaths()[0]); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("src/file.cpp", parser->getPathNames()[0]); + ASSERT_EQUALS(1, parser->mIgnoredPaths.size()); + ASSERT_EQUALS("src/file.cpp", parser->mIgnoredPaths[0]); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("src/file.cpp", parser->mPathNames[0]); ASSERT_EQUALS("cppcheck: error: could not find or open any of the paths given.\ncppcheck: Maybe all paths were ignored?\n", logger->str()); } @@ -3458,10 +3467,10 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "-isrc/file.cpp", "src\\file.cpp"}; ASSERT(!fillSettingsFromArgs(argv)); - ASSERT_EQUALS(1, parser->getIgnoredPaths().size()); - ASSERT_EQUALS("src/file.cpp", parser->getIgnoredPaths()[0]); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("src/file.cpp", parser->getPathNames()[0]); + ASSERT_EQUALS(1, parser->mIgnoredPaths.size()); + ASSERT_EQUALS("src/file.cpp", parser->mIgnoredPaths[0]); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("src/file.cpp", parser->mPathNames[0]); ASSERT_EQUALS("cppcheck: error: could not find or open any of the paths given.\ncppcheck: Maybe all paths were ignored?\n", logger->str()); } @@ -3469,10 +3478,10 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "-isrc\\", "src\\file.cpp"}; ASSERT(!fillSettingsFromArgs(argv)); - ASSERT_EQUALS(1, parser->getIgnoredPaths().size()); - ASSERT_EQUALS("src/", parser->getIgnoredPaths()[0]); - ASSERT_EQUALS(1, parser->getPathNames().size()); - ASSERT_EQUALS("src/file.cpp", parser->getPathNames()[0]); + ASSERT_EQUALS(1, parser->mIgnoredPaths.size()); + ASSERT_EQUALS("src/", parser->mIgnoredPaths[0]); + ASSERT_EQUALS(1, parser->mPathNames.size()); + ASSERT_EQUALS("src/file.cpp", parser->mPathNames[0]); ASSERT_EQUALS("cppcheck: error: could not find or open any of the paths given.\ncppcheck: Maybe all paths were ignored?\n", logger->str()); }