diff --git a/src/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp b/src/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp index a56f9a0cb25..239846a0285 100644 --- a/src/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp +++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzertool.cpp @@ -60,6 +60,22 @@ using namespace Utils; namespace ClangStaticAnalyzer { namespace Internal { +class DummyRunConfiguration : public RunConfiguration +{ + Q_OBJECT + +public: + DummyRunConfiguration(Target *parent) + : RunConfiguration(parent, "ClangStaticAnalyzer.DummyRunConfig") + { + setDefaultDisplayName(tr("Clang Static Analyzer")); + addExtraAspects(); + } + +private: + QWidget *createConfigurationWidget() override { return 0; } +}; + ClangStaticAnalyzerTool::ClangStaticAnalyzerTool(QObject *parent) : QObject(parent) , m_diagnosticModel(0) @@ -137,7 +153,8 @@ ClangStaticAnalyzerTool::ClangStaticAnalyzerTool(QObject *parent) return createRunControl(runConfiguration, runMode); }); desc.setCustomToolStarter([this](RunConfiguration *runConfiguration) { - startTool(runConfiguration); + Q_UNUSED(runConfiguration); + startTool(); }); desc.setMenuGroup(Debugger::Constants::G_ANALYZER_TOOLS); Debugger::registerAction(ClangStaticAnalyzerActionId, desc, m_startAction); @@ -220,7 +237,7 @@ static bool dontStartAfterHintForDebugMode(Project *project) return false; } -void ClangStaticAnalyzerTool::startTool(ProjectExplorer::RunConfiguration *runConfiguration) +void ClangStaticAnalyzerTool::startTool() { Project *project = SessionManager::startupProject(); QTC_ASSERT(project, emit finished(false); return); @@ -236,8 +253,21 @@ void ClangStaticAnalyzerTool::startTool(ProjectExplorer::RunConfiguration *runCo m_running = true; handleStateUpdate(); - ProjectExplorerPlugin::runRunConfiguration(runConfiguration, - Constants::CLANGSTATICANALYZER_RUN_MODE); + Target * const target = project->activeTarget(); + QTC_ASSERT(target, return); + DummyRunConfiguration *& rc = m_runConfigs[target]; + if (!rc) { + rc = new DummyRunConfiguration(target); + connect(project, &Project::aboutToRemoveTarget, this, + [this](Target *t) { m_runConfigs.remove(t); }); + const auto onProjectRemoved = [this](Project *p) { + foreach (Target * const t, p->targets()) + m_runConfigs.remove(t); + }; + connect(SessionManager::instance(), &SessionManager::aboutToRemoveProject, this, + onProjectRemoved, Qt::UniqueConnection); + } + ProjectExplorerPlugin::runRunConfiguration(rc, Constants::CLANGSTATICANALYZER_RUN_MODE); } CppTools::ProjectInfo ClangStaticAnalyzerTool::projectInfoBeforeBuild() const @@ -325,3 +355,5 @@ void ClangStaticAnalyzerTool::handleStateUpdate() } // namespace Internal } // namespace ClangStaticAnalyzer + +#include "clangstaticanalyzertool.moc" diff --git a/src/plugins/clangstaticanalyzer/clangstaticanalyzertool.h b/src/plugins/clangstaticanalyzer/clangstaticanalyzertool.h index 08580b39537..50c4c957046 100644 --- a/src/plugins/clangstaticanalyzer/clangstaticanalyzertool.h +++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzertool.h @@ -38,6 +38,7 @@ class ClangStaticAnalyzerDiagnosticFilterModel; class ClangStaticAnalyzerDiagnosticModel; class ClangStaticAnalyzerDiagnosticView; class Diagnostic; +class DummyRunConfiguration; const char ClangStaticAnalyzerPerspectiveId[] = "ClangStaticAnalyzer.Perspective"; const char ClangStaticAnalyzerActionId[] = "ClangStaticAnalyzer.Action"; @@ -58,7 +59,7 @@ public: Debugger::AnalyzerRunControl *createRunControl(ProjectExplorer::RunConfiguration *runConfiguration, Core::Id runMode); - void startTool(ProjectExplorer::RunConfiguration *rc); + void startTool(); signals: void finished(bool success); // For testing. @@ -83,6 +84,7 @@ private: QAction *m_stopAction = 0; QAction *m_goBack; QAction *m_goNext; + QHash m_runConfigs; bool m_running; bool m_toolBusy = false; };