diff options
author | Tim Jenssen <tim.jenssen@qt.io> | 2019-07-12 15:53:56 +0200 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@qt.io> | 2019-07-12 15:53:56 +0200 |
commit | 333b33edbe9805e00772c68c7a7f47c8394b786b (patch) | |
tree | bcf4f598ce58b3b99ae103e6f2d4ef12c790b84b /src/plugins/clangtools | |
parent | f7520b7d991c34b3d8e3d1d726dc0b606f32c835 (diff) | |
parent | 51cd2885ef56d43b8f421046fab6e5f85f8e6484 (diff) | |
download | qt-creator-333b33edbe9805e00772c68c7a7f47c8394b786b.tar.gz |
Merge remote-tracking branch 'origin/4.10'
Change-Id: Iaf27911e4e9fb762c1a24c84c458462bafe95728
Diffstat (limited to 'src/plugins/clangtools')
-rw-r--r-- | src/plugins/clangtools/clangtidyclazytool.cpp | 4 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtidyclazytool.h | 2 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtool.h | 2 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolruncontrol.cpp | 12 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolruncontrol.h | 1 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolslogfilereader.cpp | 12 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolslogfilereader.h | 2 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolsunittests.cpp | 88 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtoolsunittests.h | 9 |
9 files changed, 73 insertions, 59 deletions
diff --git a/src/plugins/clangtools/clangtidyclazytool.cpp b/src/plugins/clangtools/clangtidyclazytool.cpp index f07fdcd3f7..ec743c9794 100644 --- a/src/plugins/clangtools/clangtidyclazytool.cpp +++ b/src/plugins/clangtools/clangtidyclazytool.cpp @@ -464,11 +464,11 @@ void ClangTidyClazyTool::handleStateUpdate() } QList<Diagnostic> ClangTidyClazyTool::read(const QString &filePath, - const Utils::FilePath &projectRootDir, + const QSet<Utils::FilePath> &projectFiles, const QString &logFilePath, QString *errorMessage) const { - return readSerializedDiagnostics(filePath, projectRootDir, logFilePath, errorMessage); + return readSerializedDiagnostics(filePath, projectFiles, logFilePath, errorMessage); } void ClangTidyClazyTool::onNewDiagnosticsAvailable(const QList<Diagnostic> &diagnostics) diff --git a/src/plugins/clangtools/clangtidyclazytool.h b/src/plugins/clangtools/clangtidyclazytool.h index c0765dc6a9..1783290538 100644 --- a/src/plugins/clangtools/clangtidyclazytool.h +++ b/src/plugins/clangtools/clangtidyclazytool.h @@ -54,7 +54,7 @@ public: void startTool(bool askUserForFileSelection) final; QList<Diagnostic> read(const QString &filePath, - const Utils::FilePath &projectRootDir, + const QSet<Utils::FilePath> &projectFiles, const QString &logFilePath, QString *errorMessage) const final; diff --git a/src/plugins/clangtools/clangtool.h b/src/plugins/clangtools/clangtool.h index 0f322feb47..1d94719759 100644 --- a/src/plugins/clangtools/clangtool.h +++ b/src/plugins/clangtools/clangtool.h @@ -50,7 +50,7 @@ public: virtual void startTool(bool askUserForFileSelection) = 0; virtual QList<Diagnostic> read(const QString &filePath, - const Utils::FilePath &projectRootDir, + const QSet<Utils::FilePath> &projectFiles, const QString &logFilePath, QString *errorMessage) const = 0; diff --git a/src/plugins/clangtools/clangtoolruncontrol.cpp b/src/plugins/clangtools/clangtoolruncontrol.cpp index 0c2ca841e6..cd76afe4a5 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.cpp +++ b/src/plugins/clangtools/clangtoolruncontrol.cpp @@ -289,6 +289,7 @@ void ClangToolRunControl::start() } m_projectInfo = CppTools::CppModelManager::instance()->projectInfo(m_target->project()); + m_projectFiles = Utils::toSet(m_target->project()->files(Project::AllFiles)); // Some projects provides CompilerCallData once a build is finished, if (m_projectInfo.configurationOrFilesChanged(m_projectInfoBeforeBuild)) { @@ -361,6 +362,7 @@ void ClangToolRunControl::stop() QObject::disconnect(runner, nullptr, this, nullptr); delete runner; } + m_projectFiles.clear(); m_runners.clear(); m_unitsToProcess.clear(); m_progress.reportFinished(); @@ -390,22 +392,14 @@ void ClangToolRunControl::analyzeNextFile() Utils::StdOutFormat); } -static Utils::FilePath cleanPath(const Utils::FilePath &filePath) -{ - return Utils::FilePath::fromString(QDir::cleanPath(filePath.toString())); -} - void ClangToolRunControl::onRunnerFinishedWithSuccess(const QString &filePath) { const QString logFilePath = qobject_cast<ClangToolRunner *>(sender())->logFilePath(); qCDebug(LOG) << "onRunnerFinishedWithSuccess:" << logFilePath; - QTC_ASSERT(m_projectInfo.project(), return); - const Utils::FilePath projectRootDir = cleanPath(m_projectInfo.project()->projectDirectory()); - QString errorMessage; const QList<Diagnostic> diagnostics = tool()->read(filePath, - projectRootDir, + m_projectFiles, logFilePath, &errorMessage); QFile::remove(logFilePath); // Clean-up. diff --git a/src/plugins/clangtools/clangtoolruncontrol.h b/src/plugins/clangtools/clangtoolruncontrol.h index 92ecb5e2b2..2027d9513b 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.h +++ b/src/plugins/clangtools/clangtoolruncontrol.h @@ -104,6 +104,7 @@ private: QFutureInterface<void> m_progress; AnalyzeUnits m_unitsToProcess; + QSet<Utils::FilePath> m_projectFiles; QSet<ClangToolRunner *> m_runners; int m_initialFilesToProcessSize = 0; int m_filesAnalyzed = 0; diff --git a/src/plugins/clangtools/clangtoolslogfilereader.cpp b/src/plugins/clangtools/clangtoolslogfilereader.cpp index 63751181ee..76c38f44be 100644 --- a/src/plugins/clangtools/clangtoolslogfilereader.cpp +++ b/src/plugins/clangtools/clangtoolslogfilereader.cpp @@ -122,7 +122,7 @@ static ExplainingStep buildFixIt(const CXDiagnostic cxDiagnostic, unsigned index } static Diagnostic buildDiagnostic(const CXDiagnostic cxDiagnostic, - const Utils::FilePath &projectRootDir, + const QSet<Utils::FilePath> &projectFiles, const QString &nativeFilePath) { Diagnostic diagnostic; @@ -136,7 +136,7 @@ static Diagnostic buildDiagnostic(const CXDiagnostic cxDiagnostic, diagnostic.location = diagLocationFromSourceLocation(cxLocation); const auto diagnosticFilePath = Utils::FilePath::fromString(diagnostic.location.filePath); - if (!diagnosticFilePath.isChildOf(projectRootDir)) + if (!projectFiles.contains(diagnosticFilePath)) return diagnostic; // TODO: Introduce CppTools::ProjectFile::isGenerated to filter these out properly @@ -183,7 +183,7 @@ static Diagnostic buildDiagnostic(const CXDiagnostic cxDiagnostic, } static QList<Diagnostic> readSerializedDiagnostics_helper(const QString &filePath, - const Utils::FilePath &projectRootDir, + const QSet<Utils::FilePath> &projectFiles, const QString &logFilePath) { QList<Diagnostic> list; @@ -206,7 +206,7 @@ static QList<Diagnostic> readSerializedDiagnostics_helper(const QString &filePat Utils::ExecuteOnDestruction cleanUpDiagnostic([&]() { clang_disposeDiagnostic(cxDiagnostic); }); - const Diagnostic diagnostic = buildDiagnostic(cxDiagnostic, projectRootDir, nativeFilePath); + const Diagnostic diagnostic = buildDiagnostic(cxDiagnostic, projectFiles, nativeFilePath); if (!diagnostic.isValid()) continue; @@ -232,14 +232,14 @@ static bool checkFilePath(const QString &filePath, QString *errorMessage) } QList<Diagnostic> readSerializedDiagnostics(const QString &filePath, - const Utils::FilePath &projectRootDir, + const QSet<Utils::FilePath> &projectFiles, const QString &logFilePath, QString *errorMessage) { if (!checkFilePath(logFilePath, errorMessage)) return QList<Diagnostic>(); - return readSerializedDiagnostics_helper(filePath, projectRootDir, logFilePath); + return readSerializedDiagnostics_helper(filePath, projectFiles, logFilePath); } } // namespace Internal diff --git a/src/plugins/clangtools/clangtoolslogfilereader.h b/src/plugins/clangtools/clangtoolslogfilereader.h index c95ce645ae..de37c362b5 100644 --- a/src/plugins/clangtools/clangtoolslogfilereader.h +++ b/src/plugins/clangtools/clangtoolslogfilereader.h @@ -35,7 +35,7 @@ namespace ClangTools { namespace Internal { QList<Diagnostic> readSerializedDiagnostics(const QString &filePath, - const Utils::FilePath &projectRootDir, + const QSet<Utils::FilePath> &projectFiles, const QString &logFilePath, QString *errorMessage); diff --git a/src/plugins/clangtools/clangtoolsunittests.cpp b/src/plugins/clangtools/clangtoolsunittests.cpp index ff1e7ab77c..99b35dae31 100644 --- a/src/plugins/clangtools/clangtoolsunittests.cpp +++ b/src/plugins/clangtools/clangtoolsunittests.cpp @@ -25,8 +25,9 @@ #include "clangtoolsunittests.h" -#include "clangtoolsdiagnostic.h" #include "clangtidyclazytool.h" +#include "clangtoolsdiagnostic.h" +#include "clangtoolssettings.h" #include "clangtoolsutils.h" #include <coreplugin/icore.h> @@ -50,6 +51,8 @@ using namespace ProjectExplorer; using namespace Utils; +Q_DECLARE_METATYPE(CppTools::ClangDiagnosticConfig) + namespace ClangTools { namespace Internal { @@ -75,16 +78,17 @@ void ClangToolsUnitTests::cleanupTestCase() delete m_tmpDir; } -static CppTools::ClangDiagnosticConfig createTidyClazyConfig() +static CppTools::ClangDiagnosticConfig configFor(const QString &tidyChecks, + const QString &clazyChecks) { CppTools::ClangDiagnosticConfig config; - config.setId("Test.ClangTidy"); + config.setId("Test.MyTestConfig"); config.setDisplayName("Test"); config.setIsReadOnly(true); config.setClangOptions(QStringList{QStringLiteral("-Wno-everything")}); config.setClangTidyMode(CppTools::ClangDiagnosticConfig::TidyMode::ChecksPrefixList); - config.setClangTidyChecks("modernize-*, misc-*"); - config.setClazyChecks("level2"); + config.setClangTidyChecks(tidyChecks); + config.setClazyChecks(clazyChecks); return config; } @@ -92,6 +96,7 @@ void ClangToolsUnitTests::testProject() { QFETCH(QString, projectFilePath); QFETCH(int, expectedDiagCount); + QFETCH(CppTools::ClangDiagnosticConfig, diagnosticConfig); if (projectFilePath.contains("mingw")) { const ToolChain * const toolchain = ToolChainKitAspect::toolChain(KitManager::kits().constFirst(), @@ -106,23 +111,25 @@ void ClangToolsUnitTests::testProject() ClangTool *tool = ClangTidyClazyTool::instance(); // Change configs - QSharedPointer<CppTools::CppCodeModelSettings> settings = CppTools::codeModelSettings(); - const CppTools::ClangDiagnosticConfigs originalConfigs = settings->clangCustomDiagnosticConfigs(); - const Core::Id originalId = settings->clangDiagnosticConfigId(); + QSharedPointer<CppTools::CppCodeModelSettings> cppToolsSettings = CppTools::codeModelSettings(); + ClangToolsSettings *clangToolsSettings = ClangToolsSettings::instance(); + const CppTools::ClangDiagnosticConfigs originalConfigs = cppToolsSettings + ->clangCustomDiagnosticConfigs(); + const Core::Id originalId = clangToolsSettings->diagnosticConfigId(); CppTools::ClangDiagnosticConfigs modifiedConfigs = originalConfigs; - - const CppTools::ClangDiagnosticConfig clangTidyConfig = createTidyClazyConfig(); - modifiedConfigs.push_back(clangTidyConfig); + modifiedConfigs.push_back(diagnosticConfig); ExecuteOnDestruction executeOnDestruction([=]() { // Restore configs - settings->setClangCustomDiagnosticConfigs(originalConfigs); - settings->setClangDiagnosticConfigId(originalId); + cppToolsSettings->setClangCustomDiagnosticConfigs(originalConfigs); + clangToolsSettings->setDiagnosticConfigId(originalId); + clangToolsSettings->writeSettings(); }); - settings->setClangCustomDiagnosticConfigs(modifiedConfigs); - settings->setClangDiagnosticConfigId(clangTidyConfig.id()); + cppToolsSettings->setClangCustomDiagnosticConfigs(modifiedConfigs); + clangToolsSettings->setDiagnosticConfigId(diagnosticConfig.id()); + clangToolsSettings->writeSettings(); tool->startTool(false); QSignalSpy waiter(tool, SIGNAL(finished(bool))); @@ -137,43 +144,50 @@ void ClangToolsUnitTests::testProject_data() { QTest::addColumn<QString>("projectFilePath"); QTest::addColumn<int>("expectedDiagCount"); + QTest::addColumn<CppTools::ClangDiagnosticConfig>("diagnosticConfig"); - // For the simple project, we expect the following warning: - // warning: use nullptr [modernize-use-nullptr] - addTestRow("simple/simple.qbs", 1); - addTestRow("simple/simple.pro", 1); + // Test simple C++ project. + CppTools::ClangDiagnosticConfig config = configFor("modernize-use-nullptr", QString()); + addTestRow("simple/simple.qbs", 1, config); + addTestRow("simple/simple.pro", 1, config); - addTestRow("simple-library/simple-library.qbs", 0); - addTestRow("simple-library/simple-library.pro", 0); + // Test simple Qt project. + config = configFor("readability-static-accessed-through-instance", QString()); + addTestRow("qt-widgets-app/qt-widgets-app.qbs", 1, config); + addTestRow("qt-widgets-app/qt-widgets-app.pro", 1, config); - addTestRow("stdc++11-includes/stdc++11-includes.qbs", 0); - addTestRow("stdc++11-includes/stdc++11-includes.pro", 0); + // Test that libraries can be analyzed. + config = configFor(QString(), QString()); + addTestRow("simple-library/simple-library.qbs", 0, config); + addTestRow("simple-library/simple-library.pro", 0, config); - // For qt-widgets-app, we expect the following warning for "a.exec()", - // "a" being the QApplication object: - // warning: static member accessed through instance - // [readability-static-accessed-through-instance] - addTestRow("qt-widgets-app/qt-widgets-app.qbs", 1); - addTestRow("qt-widgets-app/qt-widgets-app.pro", 1); + // Test that standard headers can be parsed. + addTestRow("stdc++11-includes/stdc++11-includes.qbs", 0, config); + addTestRow("stdc++11-includes/stdc++11-includes.pro", 0, config); - addTestRow("qt-essential-includes/qt-essential-includes.qbs", 0); - addTestRow("qt-essential-includes/qt-essential-includes.pro", 0); + // Test that qt essential headers can be parsed. + addTestRow("qt-essential-includes/qt-essential-includes.qbs", 0, config); + addTestRow("qt-essential-includes/qt-essential-includes.pro", 0, config); - addTestRow("mingw-includes/mingw-includes.qbs", 0); - addTestRow("mingw-includes/mingw-includes.pro", 0); + // Test that mingw includes can be parsed. + addTestRow("mingw-includes/mingw-includes.qbs", 0, config); + addTestRow("mingw-includes/mingw-includes.pro", 0, config); + // Test that tidy and clazy diagnostics are emitted for the same project. addTestRow("clangtidy_clazy/clangtidy_clazy.pro", - 4 /* ClangTidy: modernize-*,misc-* */ - + 2 /* Clazy: level1 */); + 1 /*tidy*/ + 1 /*clazy*/, + configFor("misc-unconventional-assign-operator", "base-class-event")); } void ClangToolsUnitTests::addTestRow(const QByteArray &relativeFilePath, - int expectedDiagCount) + int expectedDiagCount, + const CppTools::ClangDiagnosticConfig &diagnosticConfig) { const QString absoluteFilePath = m_tmpDir->absolutePath(relativeFilePath); const QString fileName = QFileInfo(absoluteFilePath).fileName(); - QTest::newRow(fileName.toUtf8().constData()) << absoluteFilePath << expectedDiagCount; + QTest::newRow(fileName.toUtf8().constData()) + << absoluteFilePath << expectedDiagCount << diagnosticConfig; } } // namespace Internal diff --git a/src/plugins/clangtools/clangtoolsunittests.h b/src/plugins/clangtools/clangtoolsunittests.h index 4ea2ebd908..c54a85bf19 100644 --- a/src/plugins/clangtools/clangtoolsunittests.h +++ b/src/plugins/clangtools/clangtoolsunittests.h @@ -27,7 +27,10 @@ #include <QObject> -namespace CppTools { namespace Tests { class TemporaryCopiedDir; } } +namespace CppTools { +class ClangDiagnosticConfig; +namespace Tests { class TemporaryCopiedDir; } +} // namespace CppTools namespace ClangTools { namespace Internal { @@ -46,7 +49,9 @@ private slots: void testProject_data(); private: - void addTestRow(const QByteArray &relativeFilePath, int expectedDiagCount); + void addTestRow(const QByteArray &relativeFilePath, + int expectedDiagCount, + const CppTools::ClangDiagnosticConfig &diagnosticConfig); private: CppTools::Tests::TemporaryCopiedDir *m_tmpDir = nullptr; |