2014-09-25 11:11:58 +02:00
|
|
|
/****************************************************************************
|
|
|
|
|
**
|
|
|
|
|
** Copyright (C) 2014 Digia Plc
|
|
|
|
|
** All rights reserved.
|
|
|
|
|
** For any questions to Digia, please use contact form at http://qt.digia.com <http://qt.digia.com/>
|
|
|
|
|
**
|
|
|
|
|
** This file is part of the Qt Enterprise LicenseChecker Add-on.
|
|
|
|
|
**
|
|
|
|
|
** Licensees holding valid Qt Enterprise licenses may use this file in
|
|
|
|
|
** accordance with the Qt Enterprise License Agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
|
|
|
** a written agreement between you and Digia.
|
|
|
|
|
**
|
|
|
|
|
** If you have questions regarding the use of this file, please use
|
|
|
|
|
** contact form at http://qt.digia.com <http://qt.digia.com/>
|
|
|
|
|
**
|
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
|
|
#include "clangstaticanalyzerruncontrolfactory.h"
|
|
|
|
|
|
|
|
|
|
#include <analyzerbase/analyzermanager.h>
|
|
|
|
|
#include <analyzerbase/analyzerruncontrol.h>
|
|
|
|
|
#include <analyzerbase/analyzerstartparameters.h>
|
|
|
|
|
|
2014-11-05 13:28:44 +01:00
|
|
|
#include <cpptools/cppmodelmanager.h>
|
|
|
|
|
#include <cpptools/cppprojects.h>
|
|
|
|
|
|
2014-10-27 15:13:17 +01:00
|
|
|
#include <projectexplorer/gcctoolchain.h>
|
|
|
|
|
#include <projectexplorer/kit.h>
|
|
|
|
|
#include <projectexplorer/kitinformation.h>
|
2014-11-05 13:28:44 +01:00
|
|
|
#include <projectexplorer/session.h>
|
2014-10-27 15:13:17 +01:00
|
|
|
#include <projectexplorer/target.h>
|
|
|
|
|
#include <projectexplorer/toolchain.h>
|
|
|
|
|
|
2014-11-05 13:28:44 +01:00
|
|
|
#include <utils/qtcassert.h>
|
|
|
|
|
|
2014-09-25 11:11:58 +02:00
|
|
|
using namespace Analyzer;
|
|
|
|
|
using namespace ProjectExplorer;
|
|
|
|
|
|
|
|
|
|
namespace ClangStaticAnalyzer {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
2014-11-05 13:28:44 +01:00
|
|
|
ClangStaticAnalyzerRunControlFactory::ClangStaticAnalyzerRunControlFactory(
|
|
|
|
|
ClangStaticAnalyzerTool *tool,
|
|
|
|
|
QObject *parent)
|
2014-09-25 11:11:58 +02:00
|
|
|
: IRunControlFactory(parent)
|
2014-11-05 13:28:44 +01:00
|
|
|
, m_tool(tool)
|
2014-09-25 11:11:58 +02:00
|
|
|
{
|
2014-11-05 13:28:44 +01:00
|
|
|
QTC_CHECK(m_tool);
|
2014-09-25 11:11:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ClangStaticAnalyzerRunControlFactory::canRun(RunConfiguration *runConfiguration,
|
|
|
|
|
RunMode runMode) const
|
|
|
|
|
{
|
2014-10-27 15:13:17 +01:00
|
|
|
if (runMode != ClangStaticAnalyzerMode)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
Target *target = runConfiguration->target();
|
|
|
|
|
QTC_ASSERT(target, return false);
|
|
|
|
|
Kit *kit = target->kit();
|
|
|
|
|
QTC_ASSERT(kit, return false);
|
|
|
|
|
ToolChain *toolChain = ToolChainKitInformation::toolChain(kit);
|
|
|
|
|
QTC_ASSERT(toolChain, return false);
|
|
|
|
|
return toolChain->type() == QLatin1String("clang") || toolChain->type() == QLatin1String("gcc");
|
2014-09-25 11:11:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RunControl *ClangStaticAnalyzerRunControlFactory::create(RunConfiguration *runConfiguration,
|
|
|
|
|
RunMode runMode,
|
|
|
|
|
QString *errorMessage)
|
|
|
|
|
{
|
|
|
|
|
Q_UNUSED(runMode);
|
|
|
|
|
|
2014-11-05 13:28:44 +01:00
|
|
|
using namespace CppTools;
|
|
|
|
|
const ProjectInfo projectInfoAtAnalyzerStart = m_tool->projectInfo();
|
|
|
|
|
QTC_ASSERT(projectInfoAtAnalyzerStart.isValid(), return 0);
|
|
|
|
|
|
|
|
|
|
Project *project = SessionManager::startupProject();
|
|
|
|
|
QTC_ASSERT(project, return 0);
|
|
|
|
|
const ProjectInfo projectInfoNow = CppModelManager::instance()->projectInfo(project);
|
|
|
|
|
|
|
|
|
|
if (projectInfoNow.configurationOrFilesChanged(projectInfoAtAnalyzerStart)) {
|
|
|
|
|
// If it's more than a release/debug build configuration change, e.g.
|
|
|
|
|
// a version control checkout, files might be not valid C++ anymore
|
|
|
|
|
// or even gone, so better stop here.
|
|
|
|
|
|
|
|
|
|
m_tool->resetCursorAndProjectInfo();
|
|
|
|
|
if (errorMessage) {
|
|
|
|
|
*errorMessage = tr(
|
|
|
|
|
"The project configuration changed since the start of the Clang Static Analyzer. "
|
|
|
|
|
"Please re-run with current configuration.");
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-25 11:11:58 +02:00
|
|
|
AnalyzerStartParameters sp;
|
|
|
|
|
sp.runMode = runMode;
|
|
|
|
|
sp.startMode = StartLocal;
|
|
|
|
|
return AnalyzerManager::createRunControl(sp, runConfiguration);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Internal
|
|
|
|
|
} // namespace ClangStaticAnalyzer
|