Skip to content

Commit 074d08e

Browse files
authored
Check specific Visual Studio configurations (#2503)
1 parent 589b497 commit 074d08e

8 files changed

Lines changed: 208 additions & 11 deletions

gui/projectfile.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ void ProjectFile::clear()
6565
mMaxCtuDepth = 10;
6666
mCheckUnknownFunctionReturn.clear();
6767
mSafeChecks.clear();
68+
mVsConfigurations.clear();
6869
}
6970

7071
bool ProjectFile::read(const QString &filename)
@@ -174,6 +175,9 @@ bool ProjectFile::read(const QString &filename)
174175
if (xmlReader.name() == CppcheckXml::MaxCtuDepthElementName)
175176
mMaxCtuDepth = readInt(xmlReader, mMaxCtuDepth);
176177

178+
// VSConfiguration
179+
if (xmlReader.name() == CppcheckXml::VSConfigurationElementName)
180+
readVsConfigurations(xmlReader);
177181
break;
178182

179183
case QXmlStreamReader::EndElement:
@@ -466,6 +470,44 @@ void ProjectFile::readExcludes(QXmlStreamReader &reader)
466470
} while (!allRead);
467471
}
468472

473+
void ProjectFile::readVsConfigurations(QXmlStreamReader &reader)
474+
{
475+
QXmlStreamReader::TokenType type;
476+
do {
477+
type = reader.readNext();
478+
switch (type) {
479+
case QXmlStreamReader::StartElement:
480+
// Read library-elements
481+
if (reader.name().toString() == CppcheckXml::VSConfigurationName) {
482+
QString config;
483+
type = reader.readNext();
484+
if (type == QXmlStreamReader::Characters) {
485+
config = reader.text().toString();
486+
}
487+
mVsConfigurations << config;
488+
}
489+
break;
490+
491+
case QXmlStreamReader::EndElement:
492+
if (reader.name().toString() != CppcheckXml::VSConfigurationName)
493+
return;
494+
break;
495+
496+
// Not handled
497+
case QXmlStreamReader::NoToken:
498+
case QXmlStreamReader::Invalid:
499+
case QXmlStreamReader::StartDocument:
500+
case QXmlStreamReader::EndDocument:
501+
case QXmlStreamReader::Characters:
502+
case QXmlStreamReader::Comment:
503+
case QXmlStreamReader::DTD:
504+
case QXmlStreamReader::EntityReference:
505+
case QXmlStreamReader::ProcessingInstruction:
506+
break;
507+
}
508+
} while (true);
509+
}
510+
469511
void ProjectFile::readPlatform(QXmlStreamReader &reader)
470512
{
471513
do {
@@ -619,6 +661,11 @@ void ProjectFile::setAddons(const QStringList &addons)
619661
mAddons = addons;
620662
}
621663

664+
void ProjectFile::setVSConfigurations(const QStringList &vsConfigs)
665+
{
666+
mVsConfigurations = vsConfigs;
667+
}
668+
622669
bool ProjectFile::write(const QString &filename)
623670
{
624671
if (!filename.isEmpty())
@@ -694,6 +741,13 @@ bool ProjectFile::write(const QString &filename)
694741
xmlWriter.writeEndElement();
695742
}
696743

744+
if (!mVsConfigurations.isEmpty()) {
745+
writeStringList(xmlWriter,
746+
mVsConfigurations,
747+
CppcheckXml::VSConfigurationElementName,
748+
CppcheckXml::VSConfigurationName);
749+
}
750+
697751
writeStringList(xmlWriter,
698752
mUndefines,
699753
CppcheckXml::UndefinesElementName,

gui/projectfile.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,14 @@ class ProjectFile : public QObject {
124124
return ProjectFile::fromNativeSeparators(mExcludedPaths);
125125
}
126126

127+
/**
128+
* @brief Get list of paths to exclude from the check.
129+
* @return list of paths.
130+
*/
131+
QStringList getVsConfigurations() const {
132+
return mVsConfigurations;
133+
}
134+
127135
/**
128136
* @brief Get list libraries.
129137
* @return list of libraries.
@@ -272,6 +280,11 @@ class ProjectFile : public QObject {
272280
*/
273281
void setAddons(const QStringList &addons);
274282

283+
/** @brief Set list of Visual Studio configurations to be checked
284+
* @param vsConfigs List of configurations
285+
*/
286+
void setVSConfigurations(const QStringList &vsConfigs);
287+
275288
/**
276289
* @brief Set tags.
277290
* @param tags tag list
@@ -394,6 +407,12 @@ class ProjectFile : public QObject {
394407
*/
395408
void readExcludes(QXmlStreamReader &reader);
396409

410+
/**
411+
* @brief Read lists of Visual Studio configurations
412+
* @param reader XML stream reader.
413+
*/
414+
void readVsConfigurations(QXmlStreamReader &reader);
415+
397416
/**
398417
* @brief Read platform text.
399418
* @param reader XML stream reader.
@@ -458,6 +477,9 @@ class ProjectFile : public QObject {
458477
*/
459478
bool mAnalyzeAllVsConfigs;
460479

480+
/** Check only a selected VS configuration */
481+
QStringList mVsConfigurations;
482+
461483
/** Check code in headers */
462484
bool mCheckHeaders;
463485

gui/projectfiledialog.cpp

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,15 @@
2626
#include <QDir>
2727
#include <QSettings>
2828
#include <QProcess>
29+
#include <QListView>
2930
#include "common.h"
3031
#include "newsuppressiondialog.h"
3132
#include "projectfiledialog.h"
3233
#include "checkthread.h"
3334
#include "projectfile.h"
3435
#include "library.h"
3536
#include "platforms.h"
37+
#include "importproject.h"
3638

3739
/** Return paths from QListWidget */
3840
static QStringList getPaths(const QListWidget *list)
@@ -58,6 +60,16 @@ static const cppcheck::Platform::PlatformType builtinPlatforms[] = {
5860

5961
static const int numberOfBuiltinPlatforms = sizeof(builtinPlatforms) / sizeof(builtinPlatforms[0]);
6062

63+
QStringList ProjectFileDialog::getProjectConfigs(const QString &fileName) {
64+
QStringList ret;
65+
ImportProject importer;
66+
Settings projSettings;
67+
importer.import(fileName.toStdString(), &projSettings);
68+
for (const std::string &cfg : importer.getVSConfigs())
69+
ret << QString::fromStdString(cfg);
70+
return ret;
71+
}
72+
6173
ProjectFileDialog::ProjectFileDialog(ProjectFile *projectFile, QWidget *parent)
6274
: QDialog(parent)
6375
, mProjectFile(projectFile)
@@ -194,7 +206,7 @@ ProjectFileDialog::ProjectFileDialog(ProjectFile *projectFile, QWidget *parent)
194206
connect(mUI.mBtnRemoveSuppression, &QPushButton::clicked, this, &ProjectFileDialog::removeSuppression);
195207
connect(mUI.mListSuppressions, &QListWidget::doubleClicked, this, &ProjectFileDialog::editSuppression);
196208
connect(mUI.mBtnBrowseMisraFile, &QPushButton::clicked, this, &ProjectFileDialog::browseMisraFile);
197-
209+
connect(mUI.mChkAllVsConfigs, &QCheckBox::clicked, this, &ProjectFileDialog::checkAllVSConfigs);
198210
loadFromProjectFile(projectFile);
199211
}
200212

@@ -227,6 +239,13 @@ static void updateAddonCheckBox(QCheckBox *cb, const ProjectFile *projectFile, c
227239
}
228240
}
229241

242+
void ProjectFileDialog::checkAllVSConfigs()
243+
{
244+
if(mUI.mChkAllVsConfigs->isChecked())
245+
mUI.mListVsConfigs->selectAll();
246+
mUI.mListVsConfigs->setEnabled(!mUI.mChkAllVsConfigs->isChecked());
247+
}
248+
230249
void ProjectFileDialog::loadFromProjectFile(const ProjectFile *projectFile)
231250
{
232251
setRootPath(projectFile->getRootPath());
@@ -313,6 +332,16 @@ void ProjectFileDialog::loadFromProjectFile(const ProjectFile *projectFile)
313332
}
314333
mUI.mEditTags->setText(projectFile->getTags().join(';'));
315334
updatePathsAndDefines();
335+
if(mUI.mEditImportProject->text().endsWith(".sln") || mUI.mEditImportProject->text().endsWith(".vcxproj")) {
336+
setVsConfigurations(getProjectConfigs(mUI.mEditImportProject->text()));
337+
foreach(const QString &cfg, projectFile->getVsConfigurations()) {
338+
QList<QListWidgetItem*> items = mUI.mListVsConfigs->findItems(cfg, Qt::MatchFlag::MatchExactly);
339+
items[0]->setSelected(true);
340+
}
341+
}
342+
else
343+
mUI.mListVsConfigs->setEnabled(false);
344+
316345
}
317346

318347
void ProjectFileDialog::saveToProjectFile(ProjectFile *projectFile) const
@@ -370,6 +399,7 @@ void ProjectFileDialog::saveToProjectFile(ProjectFile *projectFile) const
370399
projectFile->setClangAnalyzer(mUI.mToolClangAnalyzer->isChecked());
371400
projectFile->setClangTidy(mUI.mToolClangTidy->isChecked());
372401
projectFile->setTags(mUI.mEditTags->text().split(";", QString::SkipEmptyParts));
402+
projectFile->setVSConfigurations(getVsConfigurations());
373403
}
374404

375405
void ProjectFileDialog::ok()
@@ -429,6 +459,7 @@ void ProjectFileDialog::updatePathsAndDefines()
429459
mUI.mBtnIncludeUp->setEnabled(!importProject);
430460
mUI.mBtnIncludeDown->setEnabled(!importProject);
431461
mUI.mChkAllVsConfigs->setEnabled(fileName.endsWith(".sln") || fileName.endsWith(".vcxproj"));
462+
mUI.mListVsConfigs->setEnabled(fileName.endsWith(".sln") || fileName.endsWith(".vcxproj"));
432463
}
433464

434465
void ProjectFileDialog::clearImportProject()
@@ -451,9 +482,26 @@ void ProjectFileDialog::browseImportProject()
451482
if (!fileName.isEmpty()) {
452483
mUI.mEditImportProject->setText(dir.relativeFilePath(fileName));
453484
updatePathsAndDefines();
485+
setVsConfigurations(getProjectConfigs(fileName));
486+
mUI.mListVsConfigs->selectAll();
454487
}
455488
}
456489

490+
QStringList ProjectFileDialog::getVsConfigurations() const
491+
{
492+
QStringList configs;
493+
foreach(QListWidgetItem *item, mUI.mListVsConfigs->selectedItems())
494+
configs << item->text();
495+
496+
return configs;
497+
}
498+
499+
void ProjectFileDialog::setVsConfigurations(const QStringList &configs)
500+
{
501+
mUI.mListVsConfigs->clear();
502+
mUI.mListVsConfigs->addItems(configs);
503+
}
504+
457505
QString ProjectFileDialog::getImportProject() const
458506
{
459507
return mUI.mEditImportProject->text();

gui/projectfiledialog.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ class ProjectFileDialog : public QDialog {
5858
*/
5959
QString getRootPath() const;
6060

61+
QStringList getVsConfigurations() const;
62+
void setVsConfigurations(const QStringList &configs);
63+
6164
QString getImportProject() const;
6265

6366
/** Get Cppcheck build dir */
@@ -256,6 +259,11 @@ protected slots:
256259
*/
257260
void browseMisraFile();
258261

262+
/**
263+
* @brief Check for all VS configurations
264+
*/
265+
void checkAllVSConfigs();
266+
259267
protected:
260268

261269
/**
@@ -295,6 +303,8 @@ protected slots:
295303
int getSuppressionIndex(const QString &shortText) const;
296304

297305
private:
306+
QStringList getProjectConfigs(const QString &fileName);
307+
298308
Ui::ProjectFile mUI;
299309

300310
/**

gui/projectfiledialog.ui

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<x>0</x>
88
<y>0</y>
99
<width>888</width>
10-
<height>585</height>
10+
<height>573</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
@@ -64,14 +64,45 @@
6464
</layout>
6565
</item>
6666
<item>
67-
<widget class="QCheckBox" name="mChkAllVsConfigs">
68-
<property name="toolTip">
69-
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You have a choice:&lt;/p&gt;&lt;p&gt; * Analyze all Debug and Release configurations&lt;/p&gt;&lt;p&gt; * Only analyze the first matching Debug configuration&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
70-
</property>
71-
<property name="text">
72-
<string>Analyze all Visual Studio configurations</string>
73-
</property>
74-
</widget>
67+
<layout class="QHBoxLayout" name="horizontalLayout_8">
68+
<item>
69+
<widget class="QCheckBox" name="mChkAllVsConfigs">
70+
<property name="toolTip">
71+
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You have a choice:&lt;/p&gt;&lt;p&gt; * Analyze all Debug and Release configurations&lt;/p&gt;&lt;p&gt; * Only analyze the first matching Debug configuration&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
72+
</property>
73+
<property name="text">
74+
<string>Analyze all Visual Studio configurations</string>
75+
</property>
76+
</widget>
77+
</item>
78+
<item>
79+
<spacer name="horizontalSpacer_2">
80+
<property name="orientation">
81+
<enum>Qt::Horizontal</enum>
82+
</property>
83+
<property name="sizeHint" stdset="0">
84+
<size>
85+
<width>40</width>
86+
<height>20</height>
87+
</size>
88+
</property>
89+
</spacer>
90+
</item>
91+
<item>
92+
<widget class="QLabel" name="mLabelVSConfig">
93+
<property name="text">
94+
<string>Selected VS Configurations</string>
95+
</property>
96+
</widget>
97+
</item>
98+
<item>
99+
<widget class="QListWidget" name="mListVsConfigs">
100+
<property name="selectionMode">
101+
<enum>QAbstractItemView::MultiSelection</enum>
102+
</property>
103+
</widget>
104+
</item>
105+
</layout>
75106
</item>
76107
</layout>
77108
</widget>

0 commit comments

Comments
 (0)