Skip to content

Commit 632dc0f

Browse files
committed
GUI: Select parser; Cppcheck or Clang
1 parent 103ecb0 commit 632dc0f

9 files changed

Lines changed: 55 additions & 4 deletions

cli/cmdlineparser.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -921,8 +921,10 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[])
921921
printMessage("If --clang is used then --cppcheck-build-dir must be specified also");
922922
return false;
923923
}
924-
std::ofstream fout(mSettings->buildDir + "/__temp__.c");
925-
fout << "int x;\n";
924+
std::ofstream fout1(mSettings->buildDir + "/__temp__.c");
925+
fout1 << "int x;\n";
926+
std::ofstream fout2(mSettings->buildDir + "/__temp__.cpp");
927+
fout2 << "int x;\n";
926928
}
927929

928930

gui/mainwindow.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,8 @@ Settings MainWindow::getCppcheckSettings()
839839
result.userDefines += define.toStdString();
840840
}
841841

842+
result.clang = mProjectFile->clangParser;
843+
842844
const QStringList undefines = mProjectFile->getUndefines();
843845
foreach (QString undefine, undefines)
844846
result.userUndefs.insert(undefine.toStdString());

gui/projectfile.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ ProjectFile::ProjectFile(const QString &filename, QObject *parent) :
4545

4646
void ProjectFile::clear()
4747
{
48+
clangParser = false;
4849
mRootPath.clear();
4950
mBuildDir.clear();
5051
mImportProject.clear();
@@ -111,6 +112,9 @@ bool ProjectFile::read(const QString &filename)
111112
if (xmlReader.name() == CppcheckXml::AnalyzeAllVsConfigsElementName)
112113
mAnalyzeAllVsConfigs = readBool(xmlReader);
113114

115+
if (xmlReader.name() == CppcheckXml::Parser)
116+
clangParser = true;
117+
114118
if (xmlReader.name() == CppcheckXml::CheckHeadersElementName)
115119
mCheckHeaders = readBool(xmlReader);
116120

@@ -709,6 +713,12 @@ bool ProjectFile::write(const QString &filename)
709713
xmlWriter.writeCharacters(mAnalyzeAllVsConfigs ? "true" : "false");
710714
xmlWriter.writeEndElement();
711715

716+
if (clangParser) {
717+
xmlWriter.writeStartElement(CppcheckXml::Parser);
718+
xmlWriter.writeCharacters("clang");
719+
xmlWriter.writeEndElement();
720+
}
721+
712722
xmlWriter.writeStartElement(CppcheckXml::CheckHeadersElementName);
713723
xmlWriter.writeCharacters(mCheckHeaders ? "true" : "false");
714724
xmlWriter.writeEndElement();

gui/projectfile.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,9 @@ class ProjectFile : public QObject {
363363
mCheckUnknownFunctionReturn = s;
364364
}
365365

366+
/** Use Clang parser */
367+
bool clangParser;
368+
366369
protected:
367370

368371
/**

gui/projectfiledialog.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,10 @@ void ProjectFileDialog::loadFromProjectFile(const ProjectFile *projectFile)
260260
mUI.mCheckHeaders->setChecked(projectFile->getCheckHeaders());
261261
mUI.mCheckUnusedTemplates->setChecked(projectFile->getCheckUnusedTemplates());
262262
mUI.mMaxCtuDepth->setValue(projectFile->getMaxCtuDepth());
263+
if (projectFile->clangParser)
264+
mUI.mBtnClangParser->setChecked(true);
265+
else
266+
mUI.mBtnCppcheckParser->setChecked(true);
263267
setExcludedPaths(projectFile->getExcludedPaths());
264268
setLibraries(projectFile->getLibraries());
265269
const QString platform = projectFile->getPlatform();
@@ -361,6 +365,7 @@ void ProjectFileDialog::saveToProjectFile(ProjectFile *projectFile) const
361365
projectFile->setCheckPaths(getCheckPaths());
362366
projectFile->setExcludedPaths(getExcludedPaths());
363367
projectFile->setLibraries(getLibraries());
368+
projectFile->clangParser = mUI.mBtnClangParser->isChecked();
364369
if (mUI.mComboBoxPlatform->currentText().endsWith(".xml"))
365370
projectFile->setPlatform(mUI.mComboBoxPlatform->currentText());
366371
else {

gui/projectfiledialog.ui

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,32 @@
344344
</layout>
345345
</widget>
346346
</item>
347+
<item>
348+
<widget class="QGroupBox" name="groupBox_10">
349+
<property name="title">
350+
<string>Parser</string>
351+
</property>
352+
<layout class="QVBoxLayout" name="verticalLayout_14">
353+
<item>
354+
<widget class="QRadioButton" name="mBtnCppcheckParser">
355+
<property name="text">
356+
<string>Cppcheck (built in)</string>
357+
</property>
358+
<property name="checked">
359+
<bool>true</bool>
360+
</property>
361+
</widget>
362+
</item>
363+
<item>
364+
<widget class="QRadioButton" name="mBtnClangParser">
365+
<property name="text">
366+
<string>Clang</string>
367+
</property>
368+
</widget>
369+
</item>
370+
</layout>
371+
</widget>
372+
</item>
347373
<item>
348374
<widget class="QGroupBox" name="groupBox_6">
349375
<property name="title">

lib/cppcheck.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,14 +254,14 @@ unsigned int CppCheck::check(const std::string &path)
254254
mErrorLogger.reportOut(std::string("Checking ") + path + "...");
255255

256256
const std::string clang = Path::isCPP(path) ? "clang++" : "clang";
257-
const std::string temp = mSettings.buildDir + "/__temp__.c";
257+
const std::string temp = mSettings.buildDir + (Path::isCPP(path) ? "/__temp__.cpp" : "/__temp__.c");
258258
const std::string clangcmd = AnalyzerInformation::getAnalyzerInfoFile(mSettings.buildDir, path, "") + ".clang-cmd";
259259
const std::string clangStderr = AnalyzerInformation::getAnalyzerInfoFile(mSettings.buildDir, path, "") + ".clang-stderr";
260260

261261
const std::string cmd1 = clang + " -v -fsyntax-only " + temp + " 2>&1";
262262
const std::pair<bool, std::string> &result1 = executeCommand(cmd1);
263263
if (!result1.first || result1.second.find(" -cc1 ") == std::string::npos) {
264-
std::cerr << "Failed to execute '" + cmd1 + "'" << std::endl;
264+
mErrorLogger.reportOut("Failed to execute '" + cmd1 + "':" + result1.second);
265265
return 0;
266266
}
267267
std::istringstream details(result1.second);

lib/importproject.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,6 +1039,8 @@ bool ImportProject::importCppcheckGuiProject(std::istream &istr, Settings *setti
10391039
guiProject.platform = node->GetText();
10401040
else if (strcmp(node->Name(), CppcheckXml::AnalyzeAllVsConfigsElementName) == 0)
10411041
guiProject.analyzeAllVsConfigs = node->GetText();
1042+
else if (strcmp(node->Name(), CppcheckXml::Parser) == 0)
1043+
temp.clang = true;
10421044
else if (strcmp(node->Name(), CppcheckXml::AddonsElementName) == 0)
10431045
temp.addons = readXmlStringList(node, "", CppcheckXml::AddonElementName, nullptr);
10441046
else if (strcmp(node->Name(), CppcheckXml::TagsElementName) == 0)

lib/importproject.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ namespace CppcheckXml {
122122
const char BuildDirElementName[] = "builddir";
123123
const char ImportProjectElementName[] = "importproject";
124124
const char AnalyzeAllVsConfigsElementName[] = "analyze-all-vs-configs";
125+
const char Parser[] = "parser";
125126
const char IncludeDirElementName[] = "includedir";
126127
const char DirElementName[] = "dir";
127128
const char DirNameAttrib[] = "name";

0 commit comments

Comments
 (0)