logic: Added migration for C/C++ standard to ProjectSettings
* extended SettingsMigrator to support lambdas * added PROJECT_STATE_NEEDS_MIGRATION and dialog for loading old project files
This commit is contained in:
@@ -3,6 +3,9 @@
|
||||
#include "settings/CxxProjectSettings.h"
|
||||
#include "settings/JavaProjectSettings.h"
|
||||
#include "utility/utility.h"
|
||||
#include "utility/utilityString.h"
|
||||
|
||||
const size_t ProjectSettings::VERSION = 1;
|
||||
|
||||
LanguageType ProjectSettings::getLanguageOfProject(FilePath projectFilePath)
|
||||
{
|
||||
@@ -45,6 +48,22 @@ std::vector<std::string> ProjectSettings::getLanguageStandards() const
|
||||
return std::vector<std::string>();
|
||||
}
|
||||
|
||||
bool ProjectSettings::needMigration() const
|
||||
{
|
||||
return getMigrations().willMigrate(this, ProjectSettings::VERSION);
|
||||
}
|
||||
|
||||
void ProjectSettings::migrate()
|
||||
{
|
||||
SettingsMigrator migrator = getMigrations();
|
||||
bool migrated = migrator.migrate(this, ProjectSettings::VERSION);
|
||||
|
||||
if (migrated)
|
||||
{
|
||||
save();
|
||||
}
|
||||
}
|
||||
|
||||
bool ProjectSettings::reload()
|
||||
{
|
||||
return Settings::load(getFilePath());
|
||||
@@ -163,3 +182,31 @@ std::string ProjectSettings::getDefaultStandard() const
|
||||
return "";
|
||||
}
|
||||
|
||||
SettingsMigrator ProjectSettings::getMigrations() const
|
||||
{
|
||||
SettingsMigrator migrator;
|
||||
|
||||
if (getLanguage() == LANGUAGE_C || getLanguage() == LANGUAGE_CPP)
|
||||
{
|
||||
migrator.addLambdaMigration(1,
|
||||
[](Settings* settings)
|
||||
{
|
||||
ProjectSettings* s = dynamic_cast<ProjectSettings*>(settings);
|
||||
|
||||
if (s->getLanguage() == LANGUAGE_C && !utility::isPrefix("c", s->getStandard()))
|
||||
{
|
||||
s->setStandard("c" + s->getStandard());
|
||||
}
|
||||
|
||||
if (s->getLanguage() == LANGUAGE_CPP && !utility::isPrefix("c++", s->getStandard()))
|
||||
{
|
||||
s->setStandard("c++" + s->getStandard());
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
return migrator;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -13,6 +13,8 @@ class ProjectSettings
|
||||
public:
|
||||
static LanguageType getLanguageOfProject(FilePath projectFilePath);
|
||||
|
||||
static const size_t VERSION;
|
||||
|
||||
ProjectSettings();
|
||||
ProjectSettings(const FilePath& projectFilePath);
|
||||
ProjectSettings(std::string projectName, const FilePath& projectFileLocation);
|
||||
@@ -22,6 +24,9 @@ public:
|
||||
|
||||
virtual std::vector<std::string> getLanguageStandards() const;
|
||||
|
||||
bool needMigration() const;
|
||||
void migrate();
|
||||
|
||||
bool reload();
|
||||
|
||||
std::string getProjectName() const;
|
||||
@@ -55,6 +60,8 @@ protected:
|
||||
private:
|
||||
virtual std::vector<std::string> getDefaultSourceExtensions() const;
|
||||
virtual std::string getDefaultStandard() const;
|
||||
|
||||
SettingsMigrator getMigrations() const;
|
||||
};
|
||||
|
||||
#endif // PROJECT_SETTINGS_H
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
#include "utility/utilityString.h"
|
||||
|
||||
Settings::Settings(const Settings& other)
|
||||
: m_filePath(other.m_filePath)
|
||||
, m_config(other.m_config->createCopy())
|
||||
: m_config(other.m_config->createCopy())
|
||||
, m_filePath(other.m_filePath)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -83,23 +83,6 @@ void Settings::setVersion(size_t version)
|
||||
setValue<int>("version", version);
|
||||
}
|
||||
|
||||
Settings Settings::createFromText(const std::shared_ptr<TextAccess> textAccess)
|
||||
{
|
||||
Settings settings;
|
||||
settings.m_config = ConfigManager::createAndLoad(textAccess);
|
||||
return settings;
|
||||
}
|
||||
|
||||
std::string Settings::getAsText() const
|
||||
{
|
||||
if (m_config)
|
||||
{
|
||||
return m_config->toString();
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
Settings::Settings()
|
||||
{
|
||||
clear();
|
||||
|
||||
@@ -28,9 +28,6 @@ public:
|
||||
size_t getVersion() const;
|
||||
void setVersion(size_t version);
|
||||
|
||||
static Settings createFromText(const std::shared_ptr<TextAccess> textAccess);
|
||||
std::string getAsText() const;
|
||||
|
||||
protected:
|
||||
Settings();
|
||||
|
||||
@@ -62,9 +59,10 @@ protected:
|
||||
|
||||
friend bool SettingsMigrator::migrate(Settings* settings, size_t targetVersion) const;
|
||||
|
||||
std::shared_ptr<ConfigManager> m_config;
|
||||
|
||||
private:
|
||||
FilePath m_filePath;
|
||||
std::shared_ptr<ConfigManager> m_config;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
|
||||
@@ -20,6 +20,36 @@ void SettingsMigrator::addMigration(size_t targetVersion, std::string oldKey, st
|
||||
m_migrations.emplace(targetVersion, migration);
|
||||
}
|
||||
|
||||
void SettingsMigrator::addLambdaMigration(size_t targetVersion, std::function<void(Settings*)> lambda)
|
||||
{
|
||||
Migration migration;
|
||||
migration.targetVersion = targetVersion;
|
||||
migration.lambda = lambda;
|
||||
|
||||
m_migrations.emplace(targetVersion, migration);
|
||||
}
|
||||
|
||||
bool SettingsMigrator::willMigrate(const Settings* settings, size_t targetVersion) const
|
||||
{
|
||||
size_t originVersion = settings->getVersion();
|
||||
|
||||
if (originVersion < targetVersion)
|
||||
{
|
||||
for (; originVersion <= targetVersion; originVersion++)
|
||||
{
|
||||
std::pair<std::multimap<size_t, Migration>::const_iterator, std::multimap<size_t, Migration>::const_iterator> ret;
|
||||
ret = m_migrations.equal_range(originVersion);
|
||||
|
||||
for (std::multimap<size_t, Migration>::const_iterator it = ret.first; it != ret.second; it++)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SettingsMigrator::migrate(Settings* settings, size_t targetVersion) const
|
||||
{
|
||||
size_t originVersion = settings->getVersion();
|
||||
@@ -35,7 +65,11 @@ bool SettingsMigrator::migrate(Settings* settings, size_t targetVersion) const
|
||||
{
|
||||
const Migration& migration = it->second;
|
||||
|
||||
if (!settings->isValueDefined(migration.newKey))
|
||||
if (!migration.oldKey.size())
|
||||
{
|
||||
migration.lambda(settings);
|
||||
}
|
||||
else if (!settings->isValueDefined(migration.newKey))
|
||||
{
|
||||
settings->setValues<std::string>(
|
||||
migration.newKey,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#ifndef SETTNGS_MIGRATOR_H
|
||||
#define SETTNGS_MIGRATOR_H
|
||||
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
@@ -15,7 +16,9 @@ public:
|
||||
virtual ~SettingsMigrator();
|
||||
|
||||
void addMigration(size_t targetVersion, std::string oldKey, std::string newKey);
|
||||
void addLambdaMigration(size_t targetVersion, std::function<void(Settings*)> lambda);
|
||||
|
||||
bool willMigrate(const Settings* settings, size_t targetVersion) const;
|
||||
bool migrate(Settings* settings, size_t targetVersion) const;
|
||||
|
||||
private:
|
||||
@@ -24,6 +27,8 @@ private:
|
||||
size_t targetVersion;
|
||||
std::string oldKey;
|
||||
std::string newKey;
|
||||
|
||||
std::function<void(Settings*)> lambda;
|
||||
};
|
||||
|
||||
std::multimap<size_t, Migration> m_migrations;
|
||||
|
||||
Reference in New Issue
Block a user