Skip to content

Commit 147315d

Browse files
committed
Fix dump and plist
1 parent 028e360 commit 147315d

3 files changed

Lines changed: 27 additions & 28 deletions

File tree

lib/cppcheck.cpp

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -123,16 +123,17 @@ class CppCheck::CppCheckLogger : public ErrorLogger
123123
mErrorList.clear();
124124
}
125125

126-
void openPlist(const std::string& filename, const std::vector<std::string>& files)
126+
void openPlist(const std::string& filename, const std::vector<std::string>* files)
127127
{
128128
mPlistFile.open(filename);
129-
mPlistFile << ErrorLogger::plistHeader(version(), files);
129+
mPlistFile << ErrorLogger::plistHeader(version());
130+
mPlistFilenames = files;
130131
}
131132

132133
void closePlist()
133134
{
134135
if (mPlistFile.is_open()) {
135-
mPlistFile << ErrorLogger::plistFooter();
136+
mPlistFile << ErrorLogger::plistFooter(mPlistFilenames);
136137
mPlistFile.close();
137138
}
138139
}
@@ -275,6 +276,7 @@ class CppCheck::CppCheckLogger : public ErrorLogger
275276
using Location = std::pair<std::string, int>;
276277
std::map<Location, std::set<std::string>> mLocationMacros; // What macros are used on a location?
277278

279+
const std::vector<std::string>* mPlistFilenames{};
278280
std::ofstream mPlistFile;
279281

280282
unsigned int mExitCode{};
@@ -994,22 +996,12 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str
994996
filename2 = file.spath();
995997
const std::size_t fileNameHash = std::hash<std::string> {}(file.spath());
996998
filename2 = mSettings.plistOutput + filename2.substr(0, filename2.find('.')) + "_" + std::to_string(fileNameHash) + ".plist";
997-
mLogger->openPlist(filename2, files);
998-
}
999-
1000-
std::string dumpProlog;
1001-
if (mSettings.dump || !mSettings.addons.empty()) {
1002-
dumpProlog += getDumpFileContentsRawTokens(files, tokens1);
999+
mLogger->openPlist(filename2, &files);
10031000
}
10041001

10051002
// Parse comments and then remove them
10061003
preprocessor.addRemarkComments(tokens1, mLogger->remarkComments());
10071004
preprocessor.inlineSuppressions(tokens1, mSuppressions.nomsg);
1008-
if (mSettings.dump || !mSettings.addons.empty()) {
1009-
std::ostringstream oss;
1010-
mSuppressions.nomsg.dump(oss);
1011-
dumpProlog += oss.str();
1012-
}
10131005
tokens1.removeComments();
10141006

10151007
if (!mSettings.buildDir.empty()) {
@@ -1106,7 +1098,6 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str
11061098
createDumpFile(mSettings, file, fileIndex, fdump, dumpFile);
11071099
if (fdump.is_open()) {
11081100
fdump << getLibraryDumpData();
1109-
fdump << dumpProlog;
11101101
if (!mSettings.dump)
11111102
filesDeleter.addFile(dumpFile);
11121103
}
@@ -1289,8 +1280,11 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str
12891280
}
12901281

12911282
// TODO: will not be closed if we encountered an exception
1292-
// dumped all configs, close root </dumps> element now
12931283
if (fdump.is_open()) {
1284+
// dump all filenames, raw tokens, suppressions
1285+
fdump << getDumpFileContentsRawTokens(files, tokens1);
1286+
mSuppressions.nomsg.dump(fdump);
1287+
// dumped all configs, close root </dumps> element now
12941288
fdump << "</dumps>" << std::endl;
12951289
fdump.close();
12961290
}

lib/errorlogger.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -818,20 +818,15 @@ std::string ErrorLogger::toxml(const std::string &str)
818818
return xml;
819819
}
820820

821-
std::string ErrorLogger::plistHeader(const std::string &version, const std::vector<std::string> &files)
821+
std::string ErrorLogger::plistHeader(const std::string &version)
822822
{
823823
std::ostringstream ostr;
824824
ostr << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"
825825
<< "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\r\n"
826826
<< "<plist version=\"1.0\">\r\n"
827827
<< "<dict>\r\n"
828828
<< " <key>clang_version</key>\r\n"
829-
<< "<string>cppcheck version " << version << "</string>\r\n"
830-
<< " <key>files</key>\r\n"
831-
<< " <array>\r\n";
832-
for (const std::string & file : files)
833-
ostr << " <string>" << ErrorLogger::toxml(file) << "</string>\r\n";
834-
ostr << " </array>\r\n"
829+
<< " <string>cppcheck version " << version << "</string>\r\n"
835830
<< " <key>diagnostics</key>\r\n"
836831
<< " <array>\r\n";
837832
return ostr.str();

lib/errorlogger.h

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <cstdint>
2929
#include <list>
3030
#include <set>
31+
#include <sstream>
3132
#include <string>
3233
#include <vector>
3334
#include <map>
@@ -268,12 +269,21 @@ class CPPCHECKLIB ErrorLogger {
268269
*/
269270
static std::string toxml(const std::string &str);
270271

271-
static std::string plistHeader(const std::string &version, const std::vector<std::string> &files);
272+
static std::string plistHeader(const std::string &version);
272273
static std::string plistData(const ErrorMessage &msg);
273-
static const char *plistFooter() {
274-
return " </array>\r\n"
275-
"</dict>\r\n"
276-
"</plist>";
274+
static std::string plistFooter(const std::vector<std::string> *files) {
275+
std::ostringstream ostr;
276+
ostr << " </array>\r\n"
277+
<< " <key>files</key>\r\n"
278+
<< " <array>\r\n";
279+
if (files) {
280+
for (const std::string& file : *files)
281+
ostr << " <string>" << ErrorLogger::toxml(file) << "</string>\r\n";
282+
}
283+
ostr << " </array>\r\n"
284+
<< "</dict>\r\n"
285+
<< "</plist>";
286+
return ostr.str();
277287
}
278288

279289
static bool isCriticalErrorId(const std::string& id) {

0 commit comments

Comments
 (0)