From 0f8ae514592c46dc8465bc5830d7a830b68affe2 Mon Sep 17 00:00:00 2001 From: Thomas Tanner Date: Sat, 17 Oct 2015 19:05:00 +0100 Subject: Added support for include-what-you-use in a very simplistic fashion to the Scons build. This isn't exactly production ready because the qt headers are a nightmarish web of interdependencies but it's useful for checking. I've also removed a few unused include files it detected and corrected some things that upset clang in a big way. --- qtmappings.imp | 195 ++++++++++++++++++++++++++++++++++++++++++++ scons_configure_template.py | 3 + src/SConscript | 14 +++- src/bbcode.cpp | 4 +- src/browserdialog.cpp | 2 - src/browserview.h | 4 +- src/downloadmanager.cpp | 1 - src/helper.h | 2 +- src/loadmechanism.cpp | 2 +- src/loadmechanism.h | 2 +- src/modinfo.cpp | 1 - src/modinfo.h | 4 +- src/nxmaccessmanager.cpp | 1 - src/settings.cpp | 1 - src/settings.h | 10 +-- 15 files changed, 223 insertions(+), 23 deletions(-) create mode 100644 qtmappings.imp diff --git a/qtmappings.imp b/qtmappings.imp new file mode 100644 index 00000000..3dc2e5f5 --- /dev/null +++ b/qtmappings.imp @@ -0,0 +1,195 @@ +[ +# Overrides. Some classes are defined by the spec to reside in their own headers but actually use the same +# header as another class. It might make some sense using this for every class in QT... + { symbol: [ "QAbstractTableModel", "private", "", "public" ] }, + { symbol: [ "QAtomicInt", "private", "", "public"] }, + { symbol: [ "QDate", "private", "", "public"] }, + { symbol: [ "QKeyEvent", "private", "", "public" ] }, + { symbol: [ "QDragEnterEvent", "private", "", "public" ] }, + { symbol: [ "QListWidgetItem", "private", "", "public" ] }, + { symbol: [ "QModelIndex", "private", "", "public" ] }, + { symbol: [ "QMouseEvent", "private", "", "public" ] }, + { symbol: [ "QMutableHashIterator", "private", "", "public" ] }, + { symbol: [ "QScopedArrayPointer", "private", "", "public" ] }, + { symbol: [ "QStyleOptionSlider", "private", "", "public" ] }, + { symbol: [ "QStyleOptionViewItem", "private", "", "public" ] }, + { symbol: [ "QTime", "private", "", "public"] }, + { symbol: [ "QTableWidgetItem", "private", "", "public" ] }, + { symbol: [ "QTreeWidgetItem", "private", "", "public" ] }, + { symbol: [ "QVBoxLayout", "private", "", "public" ] }, + { symbol: [ "QWebHitTestResult", "private", "", "public" ] }, + { symbol: [ "qobject_cast", "private", "", "public"] }, + + +# these are in QMetaType but the documentation is slightly unclear as to where they are meant to be defined. + { symbol: [ "QVariantMap", "private", "", "public" ] }, + { symbol: [ "QVariantList", "private", "", "public" ] }, + +#Normal header overrides + + { include: [ "@\"(QtCore/)?qabstractitemmodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qalgorithms\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qbytearray\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qchar\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qcoreapplication\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qcoreevent\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qdatastream\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qdatetime\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qdir\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qfile\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qfileinfo\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qflags\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qglobal\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qiodevice\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qitemselectionmodel\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qjsonvalue\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qlist\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qlocale\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qlogging\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qmap\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qnamespace\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qobject\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qobjectdefs\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qpoint\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qrect\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qregexp\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qscopedpointer\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qset\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsharedpointer_impl\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qsize\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qstring\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qstringlist\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qurl\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtCore/)?qvariant\\.h\"", "private", "", "public" ] }, + + { include: [ "@\"(QtGui/)?qbrush\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qcolor\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qfont\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qicon\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qimage\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qkeysequence\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpalette\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpen\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtGui/)?qpixmap\\.h\"", "private", "", "public" ] }, + + { include: [ "@\"(QtNetwork/)?qnetworkaccessmanager\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qnetworkrequest\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtNetwork/)?qhostaddress\\.h\"", "private", "", "public" ] }, + + { include: [ "\"QtWebKit/qwebsettings.h\"", "private", "", "public" ] }, + + { include: [ "@\"(QtWidgets/)?qabstractbutton\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qabstractitemview\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qaction\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qboxlayout\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qdialog\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qframe\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qlayout\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qlayoutitem\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qlineedit\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qstyle\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qstyleoption\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qtabwidget\\.h\"", "private", "", "public" ] }, + { include: [ "@\"(QtWidgets/)?qwidget\\.h\"", "private", "", "public" ] }, + + { include: [ "\"qabstractproxymodel.h\"", "private", "", "public" ] }, + { include: [ "\"qapplication.h\"", "private", "", "public" ] }, + { include: [ "\"qcheckbox.h\"", "private", "", "public" ] }, + { include: [ "\"qclipboard.h\"", "private", "", "public" ] }, + { include: [ "\"qcombobox.h\"", "private", "", "public" ] }, + { include: [ "\"qcommandlinkbutton.h\"", "private", "", "public" ] }, + { include: [ "\"qcryptographichash.h\"", "private", "", "public" ] }, + { include: [ "\"qdatetime.h\"", "private", "", "public" ] }, + { include: [ "\"qdebug.h\"", "private", "", "public" ] }, + { include: [ "\"qdesktopwidget.h\"", "private", "", "public" ] }, + { include: [ "\"qdialog.h\"", "private", "", "public" ] }, + { include: [ "\"qdialogbuttonbox.h\"", "private", "", "public" ] }, + { include: [ "\"qdiriterator.h\"", "private", "", "public" ] }, + { include: [ "\"qfiledialog.h\"", "private", "", "public" ] }, + { include: [ "\"qfilesystemmodel.h\"", "private", "", "public" ] }, + { include: [ "\"qfilesystemwatcher.h\"", "private", "", "public" ] }, + { include: [ "\"qhash.h\"", "private", "", "public" ] }, + { include: [ "\"qheaderview.h\"", "private", "", "public" ] }, + { include: [ "\"qinputdialog.h\"", "private", "", "public" ] }, + { include: [ "\"qitemdelegate.h\"", "private", "", "public" ] }, + { include: [ "\"qjsonarray.h\"", "private", "", "public" ] }, + { include: [ "\"qjsondocument.h\"", "private", "", "public" ] }, + { include: [ "\"qlabel.h\"", "private", "", "public" ] }, + { include: [ "\"qlibrary.h\"", "private", "", "public" ] }, + { include: [ "\"qlistwidget.h\"", "private", "", "public" ] }, + { include: [ "\"qlocalserver.h\"", "private", "", "public" ] }, + { include: [ "\"qlocalsocket.h\"", "private", "", "public" ] }, + { include: [ "\"qmainwindow.h\"", "private", "", "public" ] }, + { include: [ "\"qmenu.h\"", "private", "", "public" ] }, + { include: [ "\"qmessagebox.h\"", "private", "", "public" ] }, + { include: [ "\"qmetatype.h\"", "private", "", "public" ] }, + { include: [ "\"qmimedata.h\"", "private", "", "public" ] }, + { include: [ "\"qmutex.h\"", "private", "", "public" ] }, + { include: [ "\"qnetworkcookie.h\"", "private", "", "public" ] }, + { include: [ "\"qnetworkcookiejar.h\"", "private", "", "public" ] }, + { include: [ "\"qnetworkinterface.h\"", "private", "", "public" ] }, + { include: [ "\"qnetworkreply.h\"", "private", "", "public" ] }, + { include: [ "\"qpainter.h\"", "private", "", "public" ] }, + { include: [ "\"qprocess.h\"", "private", "", "public" ] }, + { include: [ "\"qprogressbar.h\"", "private", "", "public" ] }, + { include: [ "\"qprogressdialog.h\"", "private", "", "public" ] }, + { include: [ "\"qproxystyle.h\"", "private", "", "public" ] }, + { include: [ "\"qpushbutton.h\"", "private", "", "public" ] }, + { include: [ "\"qregexp.h\"", "private", "", "public" ] }, + { include: [ "\"qscrollbar.h\"", "private", "", "public" ] }, + { include: [ "\"qsettings.h\"", "private", "", "public" ] }, + { include: [ "\"qsharedmemory.h\"", "private", "", "public" ] }, + { include: [ "\"qshortcut.h\"", "private", "", "public" ] }, + { include: [ "\"qsortfilterproxymodel.h\"", "private", "", "public" ] }, + { include: [ "\"qstackedwidget.h\"", "private", "", "public" ] }, + { include: [ "\"qstyleditemdelegate.h\"", "private", "", "public" ] }, + { include: [ "\"qstylefactory.h\"", "private", "", "public" ] }, + { include: [ "\"qtablewidget.h\"", "private", "", "public" ] }, + { include: [ "\"qtemporaryfile.h\"", "private", "", "public" ] }, + { include: [ "\"qtextbrowser.h\"", "private", "", "public" ] }, + { include: [ "\"qtextcodec.h\"", "private", "", "public" ] }, + { include: [ "\"qtextedit.h\"", "private", "", "public" ] }, + { include: [ "\"qtextstream.h\"", "private", "", "public" ] }, + { include: [ "\"qthread.h\"", "private", "", "public" ] }, + { include: [ "\"qtimer.h\"", "private", "", "public" ] }, + { include: [ "\"qtreeview.h\"", "private", "", "public" ] }, + { include: [ "\"qtreewidget.h\"", "private", "", "public" ] }, + { include: [ "\"qurlquery.h\"", "private", "", "public" ] }, + { include: [ "\"qvalidator.h\"", "private", "", "public" ] }, + { include: [ "\"qwebframe.h\"", "private", "", "public" ] }, + { include: [ "\"qwebhistory.h\"", "private", "", "public" ] }, + { include: [ "\"qwebpage.h\"", "private", "", "public" ] }, + { include: [ "\"qwebview.h\"", "private", "", "public" ] }, + { include: [ "\"qwhatsthis.h\"", "private", "", "public" ] }, + { include: [ "\"qnetworkdiskcache.h\"", "private", "", "public" ] }, + { include: [ "\"qmimedata.h\"", "private", "", "public" ] }, + { include: [ "\"qtgroupingproxy.h\"", "private", "", "public" ] }, + +# Microsft visual C? + + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + +# Windows + + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + { include: [ "", "private", "", "public" ] }, + +# And for boost??? + +] + + + + + +#include "QtCore/qiterator.h" +#include "QtCore/qtypeinfo.h" // for swap +#include "QtCore/qtypetraits.h" // for remove_reference<>::type +#include "QtGui/qfontmetrics.h" +#include "QtGui/qwindowdefs_win.h" // for HINSTANCE +#include // for _Simple_types<>::value_type +#include // for _Tree_const_iterator diff --git a/scons_configure_template.py b/scons_configure_template.py index 67a8fad6..e4116adf 100644 --- a/scons_configure_template.py +++ b/scons_configure_template.py @@ -31,3 +31,6 @@ ZLIBPATH = r"C:\Apps\zlib-1.2.8" # though you have to set it up in the configuration GIT = r"C:\Program Files\git\bin\git.exe" MERCURIAL = r"C:\Program Files\TortoiseHg\hg.exe" + +# Path to include-what-you-use. This is currently rather experimental +#IWYU = r"C:\Apps\include-what-you-use\bin\include-what-you-use.exe" diff --git a/src/SConscript b/src/SConscript index f09db093..cd2d8a52 100644 --- a/src/SConscript +++ b/src/SConscript @@ -67,7 +67,6 @@ env.Uic(env.Glob('*.ui')) env.RequireLibraries('uibase', 'shared', 'bsatk', 'esptk') - env.AppendUnique(LIBS = [ 'shell32', 'user32', @@ -114,8 +113,9 @@ env.AppendUnique(LINKFLAGS = [ # modeltest is optional and it doesn't compile anyway... cpp_files = [ - x for x in Glob('*.cpp') - if x.name != 'modeltest.cpp' and x.name != 'aboutdialog.cpp' + x for x in env.Glob('*.cpp', source = True) + if x.name != 'modeltest.cpp' and x.name != 'aboutdialog.cpp' and \ + not x.name.startswith('moc_') # I think this is a strange bug ] about_env = env.Clone() @@ -143,6 +143,14 @@ env.AppendUnique(LIBS = 'zlibstatic') prog = env.Program('ModOrganizer', cpp_files + env.Glob('*.qrc') + other_sources) +############################################################################### +# I'd like to automatically add this to every .o generation. +if 'IWYU' in env: + for f in cpp_files + [ env.File('aboutdialog.cpp') ]: + env.AddPostAction(prog, "-$IWYU $IWYU_FLAGS -Xiwyu --mapping_file=$IWYU_MAPPING_FILE $IWYU_COMCOM " + str(f)) + env.Depends(prog, env['IWYU_MAPPING_FILE']) +############################################################################### + env.InstallModule(prog) for subdir in ('tutorials', 'stylesheets'): diff --git a/src/bbcode.cpp b/src/bbcode.cpp index 0f9170d4..56369538 100644 --- a/src/bbcode.cpp +++ b/src/bbcode.cpp @@ -21,8 +21,6 @@ along with Mod Organizer. If not, see . #include #include -#include -#include namespace BBCode { @@ -80,7 +78,7 @@ public: if (tagName == "color") { QString color = tagIter->second.first.cap(1); QString content = tagIter->second.first.cap(2); - if (color.at(0) == "#") { + if (color.at(0) == '#') { return temp.replace(tagIter->second.first, QString("%2").arg(color, content)); } else { auto colIter = m_ColorMap.find(color.toLower()); diff --git a/src/browserdialog.cpp b/src/browserdialog.cpp index c382c112..5e6bec00 100644 --- a/src/browserdialog.cpp +++ b/src/browserdialog.cpp @@ -25,8 +25,6 @@ along with Mod Organizer. If not, see . #include "report.h" #include "persistentcookiejar.h" -#include "json.h" - #include #include #include "settings.h" diff --git a/src/browserview.h b/src/browserview.h index f8b132b8..6a89752a 100644 --- a/src/browserview.h +++ b/src/browserview.h @@ -21,9 +21,11 @@ along with Mod Organizer. If not, see . #define NEXUSVIEW_H +class QEvent; +class QUrl; +class QWidget; #include #include -#include /** * @brief web view used to display a nexus page diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index bc78cdc6..1aaf4122 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -25,7 +25,6 @@ along with Mod Organizer. If not, see . #include #include #include "utility.h" -#include "json.h" #include "selectiondialog.h" #include "bbcode.h" #include diff --git a/src/helper.h b/src/helper.h index 36f10db1..410e2527 100644 --- a/src/helper.h +++ b/src/helper.h @@ -21,7 +21,7 @@ along with Mod Organizer. If not, see . #define HELPER_H -#include +#include /** diff --git a/src/loadmechanism.cpp b/src/loadmechanism.cpp index 4d06bea9..c01955f2 100644 --- a/src/loadmechanism.cpp +++ b/src/loadmechanism.cpp @@ -56,7 +56,7 @@ void LoadMechanism::writeHintFile(const QDir &targetDirectory) } -void LoadMechanism::removeHintFile(QDir &targetDirectory) +void LoadMechanism::removeHintFile(QDir targetDirectory) { targetDirectory.remove("mo_path.txt"); } diff --git a/src/loadmechanism.h b/src/loadmechanism.h index 43a8dd6c..c04473ab 100644 --- a/src/loadmechanism.h +++ b/src/loadmechanism.h @@ -91,7 +91,7 @@ private: void writeHintFile(const QDir &targetDirectory); // remove the hint file if it exists. does nothing if the file doesn't exist - void removeHintFile(QDir &targetDirectory); + void removeHintFile(QDir targetDirectory); // compare the two files by md5-hash, returns true if they are identical bool hashIdentical(const QString &fileNameLHS, const QString &fileNameRHS); diff --git a/src/modinfo.cpp b/src/modinfo.cpp index e0d888e6..ae64b81f 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -25,7 +25,6 @@ along with Mod Organizer. If not, see . #include "report.h" #include "modinfodialog.h" #include "overwriteinfodialog.h" -#include "json.h" #include "messagedialog.h" #include "filenamestring.h" diff --git a/src/modinfo.h b/src/modinfo.h index da97b09b..d9de60e8 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -1047,7 +1047,7 @@ public: virtual QString notes() const { return ""; } virtual QDateTime creationTime() const { return QDateTime(); } virtual QString absolutePath() const; - virtual MOBase::VersionInfo getNewestVersion() const { return ""; } + virtual MOBase::VersionInfo getNewestVersion() const { return QString(); } virtual QString getInstallationFile() const { return ""; } virtual int getFixedPriority() const { return INT_MAX; } virtual int getNexusID() const { return -1; } @@ -1099,7 +1099,7 @@ public: virtual QString notes() const { return ""; } virtual QDateTime creationTime() const; virtual QString absolutePath() const; - virtual MOBase::VersionInfo getNewestVersion() const { return ""; } + virtual MOBase::VersionInfo getNewestVersion() const { return QString(); } virtual QString getInstallationFile() const { return ""; } virtual int getNexusID() const { return -1; } virtual std::vector getIniTweaks() const { return std::vector(); } diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp index 0763bb71..6ec282f6 100644 --- a/src/nxmaccessmanager.cpp +++ b/src/nxmaccessmanager.cpp @@ -25,7 +25,6 @@ along with Mod Organizer. If not, see . #include "persistentcookiejar.h" #include "settings.h" #include -#include #include #include #include diff --git a/src/settings.cpp b/src/settings.cpp index 4c2a34c8..b51ba71e 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -22,7 +22,6 @@ along with Mod Organizer. If not, see . #include "settingsdialog.h" #include "utility.h" #include "helper.h" -#include "json.h" #include #include #include diff --git a/src/settings.h b/src/settings.h index def1dc5c..580ffe42 100644 --- a/src/settings.h +++ b/src/settings.h @@ -328,7 +328,7 @@ private: }; /** Display/store the configuration in the 'general' tab of the settings dialogue */ - class GeneralTab : SettingsTab + class GeneralTab : public SettingsTab { public: GeneralTab(Settings *m_parent, SettingsDialog &m_dialog); @@ -347,7 +347,7 @@ private: }; /** Display/store the configuration in the 'nexus' tab of the settings dialogue */ - class NexusTab : SettingsTab + class NexusTab : public SettingsTab { public: NexusTab(Settings *m_parent, SettingsDialog &m_dialog); @@ -365,7 +365,7 @@ private: }; /** Display/store the configuration in the 'steam' tab of the settings dialogue */ - class SteamTab : SettingsTab + class SteamTab : public SettingsTab { public: SteamTab(Settings *m_parent, SettingsDialog &m_dialog); @@ -378,7 +378,7 @@ private: }; /** Display/store the configuration in the 'plugins' tab of the settings dialogue */ - class PluginsTab : SettingsTab + class PluginsTab : public SettingsTab { public: PluginsTab(Settings *m_parent, SettingsDialog &m_dialog); @@ -391,7 +391,7 @@ private: }; /** Display/store the configuration in the 'workarounds' tab of the settings dialogue */ - class WorkaroundsTab : SettingsTab + class WorkaroundsTab : public SettingsTab { public: WorkaroundsTab(Settings *m_parent, SettingsDialog &m_dialog); -- cgit v1.3.1