summaryrefslogtreecommitdiff
path: root/src/plugins/compilationdatabaseprojectmanager
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/compilationdatabaseprojectmanager')
-rw-r--r--src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp59
-rw-r--r--src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h17
-rw-r--r--src/plugins/compilationdatabaseprojectmanager/compilationdatabaseprojectmanagerplugin.cpp76
-rw-r--r--src/plugins/compilationdatabaseprojectmanager/compilationdatabaseprojectmanagerplugin.h16
-rw-r--r--src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp44
-rw-r--r--src/plugins/compilationdatabaseprojectmanager/compilationdbparser.h13
6 files changed, 130 insertions, 95 deletions
diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp
index ec16d72bd5..d9bf685f08 100644
--- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp
+++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp
@@ -34,6 +34,7 @@
#include <projectexplorer/buildinfo.h>
#include <projectexplorer/buildsteplist.h>
#include <projectexplorer/buildtargetinfo.h>
+#include <projectexplorer/deploymentdata.h>
#include <projectexplorer/gcctoolchain.h>
#include <projectexplorer/headerpath.h>
#include <projectexplorer/kitinformation.h>
@@ -47,6 +48,7 @@
#include <texteditor/textdocument.h>
#include <utils/algorithm.h>
+#include <utils/filesystemwatcher.h>
#include <utils/qtcassert.h>
#include <utils/runextensions.h>
@@ -390,26 +392,27 @@ void CompilationDatabaseProject::buildTreeAndProjectParts()
setRootProjectNode(std::move(root));
m_cppCodeModelUpdater->update({this, kitInfo, activeParseEnvironment(), rpps});
+ updateDeploymentData();
}
CompilationDatabaseProject::CompilationDatabaseProject(const Utils::FilePath &projectFile)
: Project(Constants::COMPILATIONDATABASEMIMETYPE, projectFile)
, m_cppCodeModelUpdater(std::make_unique<CppTools::CppProjectUpdater>())
, m_parseDelay(new QTimer(this))
+ , m_deployFileWatcher(new FileSystemWatcher(this))
{
setId(Constants::COMPILATIONDATABASEPROJECT_ID);
setProjectLanguages(Core::Context(ProjectExplorer::Constants::CXX_LANGUAGE_ID));
setDisplayName(projectDirectory().fileName());
- setRequiredKitPredicate([](const Kit *) { return false; });
- setPreferredKitPredicate([](const Kit *) { return false; });
m_kit.reset(KitManager::defaultKit()->clone());
addTargetForKit(m_kit.get());
- connect(this,
- &CompilationDatabaseProject::rootProjectDirectoryChanged,
- m_parseDelay,
- QOverload<>::of(&QTimer::start));
+ connect(this, &CompilationDatabaseProject::rootProjectDirectoryChanged,
+ this, [this] {
+ m_projectFileHash.clear();
+ m_parseDelay->start();
+ });
setExtraProjectFiles(
{projectFile.stringAppended(Constants::COMPILATIONDATABASEPROJECT_FILES_SUFFIX)});
@@ -419,6 +422,10 @@ CompilationDatabaseProject::CompilationDatabaseProject(const Utils::FilePath &pr
m_parseDelay->setInterval(1000);
connect(this, &Project::projectFileIsDirty, this, &CompilationDatabaseProject::reparseProject);
+ connect(m_deployFileWatcher, &FileSystemWatcher::fileChanged,
+ this, &CompilationDatabaseProject::updateDeploymentData);
+ connect(this, &Project::activeTargetChanged,
+ this, &CompilationDatabaseProject::updateDeploymentData);
}
Utils::FilePath CompilationDatabaseProject::rootPathFromSettings() const
@@ -458,14 +465,34 @@ void CompilationDatabaseProject::reparseProject()
m_mimeBinaryCache,
guardParsingRun(),
this);
- connect(m_parser, &CompilationDbParser::finished, this, [this](bool success) {
- if (success)
+ connect(m_parser, &CompilationDbParser::finished, this, [this](ParseResult result) {
+ m_projectFileHash = m_parser->projectFileHash();
+ if (result == ParseResult::Success)
buildTreeAndProjectParts();
m_parser = nullptr;
});
+ m_parser->setPreviousProjectFileHash(m_projectFileHash);
m_parser->start();
}
+void CompilationDatabaseProject::updateDeploymentData()
+{
+ Target * const target = activeTarget();
+ if (!target)
+ return;
+ const Utils::FilePath deploymentFilePath = projectDirectory()
+ .pathAppended("QtCreatorDeployment.txt");
+ DeploymentData deploymentData;
+ deploymentData.addFilesFromDeploymentFile(deploymentFilePath.toString(),
+ projectDirectory().toString());
+ target->setDeploymentData(deploymentData);
+ if (m_deployFileWatcher->files() != QStringList(deploymentFilePath.toString())) {
+ m_deployFileWatcher->removeFiles(m_deployFileWatcher->files());
+ m_deployFileWatcher->addFile(deploymentFilePath.toString(),
+ FileSystemWatcher::WatchModifiedDate);
+ }
+}
+
CompilationDatabaseProject::~CompilationDatabaseProject()
{
m_parserWatcher.cancel();
@@ -498,19 +525,6 @@ CompilationDatabaseBuildConfiguration::CompilationDatabaseBuildConfiguration(
ProjectExplorer::Target *target, Core::Id id)
: ProjectExplorer::BuildConfiguration(target, id)
{
- target->setApplicationTargets({BuildTargetInfo()});
-}
-
-void CompilationDatabaseBuildConfiguration::initialize()
-{
- ProjectExplorer::BuildConfiguration::initialize();
- BuildStepList *buildSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
- buildSteps->appendStep(ProjectExplorer::Constants::PROCESS_STEP_ID);
-}
-
-ProjectExplorer::NamedWidget *CompilationDatabaseBuildConfiguration::createConfigWidget()
-{
- return new ProjectExplorer::NamedWidget();
}
CompilationDatabaseBuildConfigurationFactory::CompilationDatabaseBuildConfigurationFactory()
@@ -523,13 +537,14 @@ CompilationDatabaseBuildConfigurationFactory::CompilationDatabaseBuildConfigurat
}
QList<BuildInfo> CompilationDatabaseBuildConfigurationFactory::availableBuilds
- (const Kit *kit, const FilePath &, bool) const
+ (const Kit *kit, const FilePath &projectPath, bool) const
{
const QString name = tr("Release");
ProjectExplorer::BuildInfo info(this);
info.typeName = name;
info.displayName = name;
info.buildType = BuildConfiguration::Release;
+ info.buildDirectory = projectPath.parentDir();
info.kitId = kit->id();
return {info};
}
diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h
index ca829f312a..900f7d3675 100644
--- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h
+++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h
@@ -38,13 +38,9 @@ QT_BEGIN_NAMESPACE
class QTimer;
QT_END_NAMESPACE
-namespace CppTools {
-class CppProjectUpdater;
-}
-
-namespace ProjectExplorer {
-class Kit;
-}
+namespace CppTools { class CppProjectUpdater; }
+namespace ProjectExplorer { class Kit; }
+namespace Utils { class FileSystemWatcher; }
namespace CompilationDatabaseProjectManager {
namespace Internal {
@@ -63,6 +59,7 @@ private:
RestoreResult fromMap(const QVariantMap &map, QString *errorMessage) override;
void reparseProject();
+ void updateDeploymentData();
void buildTreeAndProjectParts();
Utils::FilePath rootPathFromSettings() const;
@@ -70,8 +67,10 @@ private:
std::unique_ptr<CppTools::CppProjectUpdater> m_cppCodeModelUpdater;
std::unique_ptr<ProjectExplorer::Kit> m_kit;
MimeBinaryCache m_mimeBinaryCache;
+ QByteArray m_projectFileHash;
QTimer * const m_parseDelay;
CompilationDbParser *m_parser = nullptr;
+ Utils::FileSystemWatcher * const m_deployFileWatcher;
};
class CompilationDatabaseEditorFactory : public TextEditor::TextEditorFactory
@@ -87,10 +86,6 @@ class CompilationDatabaseBuildConfiguration : public ProjectExplorer::BuildConfi
Q_OBJECT
public:
CompilationDatabaseBuildConfiguration(ProjectExplorer::Target *target, Core::Id id);
- ProjectExplorer::NamedWidget *createConfigWidget() override;
-
-protected:
- void initialize() override;
};
class CompilationDatabaseBuildConfigurationFactory
diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseprojectmanagerplugin.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseprojectmanagerplugin.cpp
index 0eca37325c..04d9af3e91 100644
--- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseprojectmanagerplugin.cpp
+++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseprojectmanagerplugin.cpp
@@ -33,75 +33,87 @@
#include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/actionmanager/command.h>
#include <coreplugin/fileiconprovider.h>
+
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/projectmanager.h>
#include <projectexplorer/projecttree.h>
#include <projectexplorer/session.h>
+
+#include <utils/parameteraction.h>
#include <utils/utilsicons.h>
+using namespace Core;
+using namespace ProjectExplorer;
+
namespace CompilationDatabaseProjectManager {
namespace Internal {
const char CHANGEROOTDIR[] = "CompilationDatabaseProjectManager.ChangeRootDirectory";
const char COMPILE_COMMANDS_JSON[] = "compile_commands.json";
+class CompilationDatabaseProjectManagerPluginPrivate
+{
+public:
+ CompilationDatabaseEditorFactory editorFactory;
+ CompilationDatabaseBuildConfigurationFactory buildConfigFactory;
+ QAction changeRootAction{CompilationDatabaseProjectManagerPlugin::tr("Change Root Directory")};
+};
+
+CompilationDatabaseProjectManagerPlugin::~CompilationDatabaseProjectManagerPlugin()
+{
+ delete d;
+}
+
bool CompilationDatabaseProjectManagerPlugin::initialize(const QStringList &arguments, QString *errorMessage)
{
Q_UNUSED(arguments)
Q_UNUSED(errorMessage)
- Core::FileIconProvider::registerIconOverlayForFilename(
+
+ d = new CompilationDatabaseProjectManagerPluginPrivate;
+
+ FileIconProvider::registerIconOverlayForFilename(
Utils::Icons::PROJECT.imageFileName(),
COMPILE_COMMANDS_JSON);
- Core::FileIconProvider::registerIconOverlayForFilename(
+ FileIconProvider::registerIconOverlayForFilename(
Utils::Icons::PROJECT.imageFileName(),
QString(COMPILE_COMMANDS_JSON) + Constants::COMPILATIONDATABASEPROJECT_FILES_SUFFIX);
- ProjectExplorer::ProjectManager::registerProjectType<CompilationDatabaseProject>(
+ ProjectManager::registerProjectType<CompilationDatabaseProject>(
Constants::COMPILATIONDATABASEMIMETYPE);
- m_changeProjectRootDirectoryAction = new QAction(tr("Change Root Directory"), this);
- Core::Command *cmd = Core::ActionManager::registerAction(m_changeProjectRootDirectoryAction,
- CHANGEROOTDIR);
- Core::ActionContainer *mprojectContextMenu = Core::ActionManager::actionContainer(
+
+ Command *cmd = ActionManager::registerAction(&d->changeRootAction, CHANGEROOTDIR);
+
+ ActionContainer *mprojectContextMenu = ActionManager::actionContainer(
ProjectExplorer::Constants::M_PROJECTCONTEXT);
mprojectContextMenu->addSeparator(ProjectExplorer::Constants::G_PROJECT_TREE);
mprojectContextMenu->addAction(cmd, ProjectExplorer::Constants::G_PROJECT_TREE);
- connect(m_changeProjectRootDirectoryAction,
- &QAction::triggered,
- ProjectExplorer::ProjectTree::instance(),
- &ProjectExplorer::ProjectTree::changeProjectRootDirectory);
+ connect(&d->changeRootAction, &QAction::triggered,
+ ProjectTree::instance(), &ProjectTree::changeProjectRootDirectory);
- connect(ProjectExplorer::SessionManager::instance(),
- &ProjectExplorer::SessionManager::startupProjectChanged,
- this,
- &CompilationDatabaseProjectManagerPlugin::projectChanged);
- connect(ProjectExplorer::ProjectTree::instance(),
- &ProjectExplorer::ProjectTree::currentProjectChanged,
- this,
- &CompilationDatabaseProjectManagerPlugin::projectChanged);
+ const auto onProjectChanged = [this] {
+ const auto currentProject = qobject_cast<CompilationDatabaseProject *>(
+ ProjectTree::currentProject());
- return true;
-}
+ d->changeRootAction.setEnabled(currentProject);
+ };
-void CompilationDatabaseProjectManagerPlugin::projectChanged()
-{
- const auto *currentProject = qobject_cast<CompilationDatabaseProject *>(
- ProjectExplorer::ProjectTree::currentProject());
+ connect(SessionManager::instance(), &SessionManager::startupProjectChanged,
+ this, onProjectChanged);
- m_changeProjectRootDirectoryAction->setEnabled(currentProject);
-}
+ connect(ProjectTree::instance(), &ProjectTree::currentProjectChanged,
+ this, onProjectChanged);
-void CompilationDatabaseProjectManagerPlugin::extensionsInitialized()
-{
+ return true;
}
QVector<QObject *> CompilationDatabaseProjectManagerPlugin::createTestObjects() const
{
- QVector<QObject *> tests;
+ return {
#ifdef WITH_TESTS
- tests << new CompilationDatabaseTests;
+ new CompilationDatabaseTests
#endif
- return tests;
+ };
}
} // namespace Internal
diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseprojectmanagerplugin.h b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseprojectmanagerplugin.h
index 42a15ad3cf..b825172ca6 100644
--- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseprojectmanagerplugin.h
+++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseprojectmanagerplugin.h
@@ -25,11 +25,7 @@
#pragma once
-#include "compilationdatabaseproject.h"
-
-#include <coreplugin/id.h>
#include <extensionsystem/iplugin.h>
-#include <utils/parameteraction.h>
namespace CompilationDatabaseProjectManager {
namespace Internal {
@@ -39,17 +35,13 @@ class CompilationDatabaseProjectManagerPlugin final : public ExtensionSystem::IP
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "CompilationDatabaseProjectManager.json")
-public:
- bool initialize(const QStringList &arguments, QString *errorMessage) final;
- void extensionsInitialized() final;
-private:
- void projectChanged();
+ ~CompilationDatabaseProjectManagerPlugin();
+ bool initialize(const QStringList &arguments, QString *errorMessage) final;
+ void extensionsInitialized() final {}
QVector<QObject *> createTestObjects() const final;
- CompilationDatabaseEditorFactory factory;
- CompilationDatabaseBuildConfigurationFactory buildConfigFactory;
- QAction *m_changeProjectRootDirectoryAction;
+ class CompilationDatabaseProjectManagerPluginPrivate *d = nullptr;
};
} // namespace Internal
diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp
index 6c91311898..374c245b23 100644
--- a/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp
+++ b/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.cpp
@@ -31,6 +31,7 @@
#include <utils/mimetypes/mimetype.h>
#include <utils/runextensions.h>
+#include <QCryptographicHash>
#include <QDir>
#include <QFileInfo>
#include <QJsonArray>
@@ -59,12 +60,27 @@ CompilationDbParser::CompilationDbParser(const QString &projectName,
connect(&m_parserWatcher, &QFutureWatcher<void>::finished, this, [this] {
m_dbContents = m_parserWatcher.result();
if (!m_treeScanner || m_treeScanner->isFinished())
- finish();
+ finish(ParseResult::Success);
});
}
void CompilationDbParser::start()
{
+ // Check hash first.
+ QFile file(m_projectFilePath.toString());
+ if (!file.open(QIODevice::ReadOnly)) {
+ finish(ParseResult::Failure);
+ return;
+ }
+ m_projectFileContents = file.readAll();
+ const QByteArray newHash = QCryptographicHash::hash(m_projectFileContents,
+ QCryptographicHash::Sha1);
+ if (m_projectFileHash == newHash) {
+ finish(ParseResult::Cached);
+ return;
+ }
+ m_projectFileHash = newHash;
+
// Thread 1: Scan disk.
if (!m_rootPath.isEmpty()) {
m_treeScanner = new TreeScanner(this);
@@ -95,7 +111,7 @@ void CompilationDbParser::start()
"CompilationDatabase.Scan.Tree");
connect(m_treeScanner, &TreeScanner::finished, this, [this] {
if (m_parserWatcher.isFinished())
- finish();
+ finish(ParseResult::Success);
});
}
@@ -126,9 +142,9 @@ QList<FileNode *> CompilationDbParser::scannedFiles() const
? m_treeScanner->release() : QList<FileNode *>();
}
-void CompilationDbParser::finish()
+void CompilationDbParser::finish(ParseResult result)
{
- emit finished(true);
+ emit finished(result);
deleteLater();
}
@@ -158,24 +174,20 @@ static FilePath jsonObjectFilename(const QJsonObject &object)
return fileName;
}
-static std::vector<DbEntry> readJsonObjects(const QString &filePath)
+std::vector<DbEntry> CompilationDbParser::readJsonObjects() const
{
std::vector<DbEntry> result;
- QFile file(filePath);
- if (!file.open(QIODevice::ReadOnly))
- return result;
- const QByteArray contents = file.readAll();
- int objectStart = contents.indexOf('{');
- int objectEnd = contents.indexOf('}', objectStart + 1);
+ int objectStart = m_projectFileContents.indexOf('{');
+ int objectEnd = m_projectFileContents.indexOf('}', objectStart + 1);
QSet<QString> flagsCache;
while (objectStart >= 0 && objectEnd >= 0) {
const QJsonDocument document = QJsonDocument::fromJson(
- contents.mid(objectStart, objectEnd - objectStart + 1));
+ m_projectFileContents.mid(objectStart, objectEnd - objectStart + 1));
if (document.isNull()) {
// The end was found incorrectly, search for the next one.
- objectEnd = contents.indexOf('}', objectEnd + 1);
+ objectEnd = m_projectFileContents.indexOf('}', objectEnd + 1);
continue;
}
@@ -185,8 +197,8 @@ static std::vector<DbEntry> readJsonObjects(const QString &filePath)
fileName.toFileInfo().baseName());
result.push_back({flags, fileName, object["directory"].toString()});
- objectStart = contents.indexOf('{', objectEnd + 1);
- objectEnd = contents.indexOf('}', objectStart + 1);
+ objectStart = m_projectFileContents.indexOf('{', objectEnd + 1);
+ objectEnd = m_projectFileContents.indexOf('}', objectStart + 1);
}
return result;
@@ -217,7 +229,7 @@ QStringList readExtraFiles(const QString &filePath)
DbContents CompilationDbParser::parseProject()
{
DbContents dbContents;
- dbContents.entries = readJsonObjects(m_projectFilePath.toString());
+ dbContents.entries = readJsonObjects();
dbContents.extraFileName = m_projectFilePath.toString() +
Constants::COMPILATIONDATABASEPROJECT_FILES_SUFFIX;
dbContents.extras = readExtraFiles(dbContents.extraFileName);
diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.h b/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.h
index fe3e319076..ac5fbb0afb 100644
--- a/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.h
+++ b/src/plugins/compilationdatabaseprojectmanager/compilationdbparser.h
@@ -46,6 +46,8 @@ class TreeScanner;
namespace CompilationDatabaseProjectManager {
namespace Internal {
+enum class ParseResult { Success, Failure, Cached };
+
class CompilationDbParser : public QObject
{
Q_OBJECT
@@ -57,6 +59,10 @@ public:
ProjectExplorer::Project::ParseGuard &&guard,
QObject *parent = nullptr);
+
+ void setPreviousProjectFileHash(const QByteArray &fileHash) { m_projectFileHash = fileHash; }
+ QByteArray projectFileHash() const { return m_projectFileHash; }
+
void start();
void stop();
@@ -68,11 +74,12 @@ public:
}
signals:
- void finished(bool success);
+ void finished(ParseResult result);
private:
- void finish();
+ void finish(ParseResult result);
DbContents parseProject();
+ std::vector<DbEntry> readJsonObjects() const;
const QString m_projectName;
const Utils::FilePath m_projectFilePath;
@@ -81,6 +88,8 @@ private:
ProjectExplorer::TreeScanner *m_treeScanner = nullptr;
QFutureWatcher<DbContents> m_parserWatcher;
DbContents m_dbContents;
+ QByteArray m_projectFileContents;
+ QByteArray m_projectFileHash;
ProjectExplorer::Project::ParseGuard m_guard;
};