#pragma once
#include <tools/solidityUpgrade/UpgradeChange.h>
#include <tools/solidityUpgrade/Upgrade050.h>
#include <tools/solidityUpgrade/Upgrade060.h>
#include <tools/solidityUpgrade/Upgrade070.h>
#include <libsolidity/interface/CompilerStack.h>
#include <libsolidity/interface/DebugSettings.h>
#include <liblangutil/EVMVersion.h>
#include <boost/program_options.hpp>
#include <boost/filesystem/path.hpp>
#include <memory>
namespace solidity::tools
{
class SourceUpgrade
{
public:
bool parseArguments(int _argc, char** _argv);
void printPrologue();
bool processInput();
private:
enum class Module
{
ConstructorKeyword,
VisibilitySpecifier,
AbstractContract,
OverridingFunction,
VirtualFunction,
DotSyntax,
NowKeyword,
ConstrutorVisibility
};
class Suite: public UpgradeSuite
{
public:
void analyze(langutil::CharStreamProvider const& _charStreamProvider, frontend::SourceUnit const& _sourceUnit)
{
if (isActivated(Module::ConstructorKeyword))
ConstructorKeyword{_charStreamProvider, m_changes}.analyze(_sourceUnit);
if (isActivated(Module::VisibilitySpecifier))
VisibilitySpecifier{_charStreamProvider, m_changes}.analyze(_sourceUnit);
if (isActivated(Module::AbstractContract))
AbstractContract{_charStreamProvider, m_changes}.analyze(_sourceUnit);
if (isActivated(Module::OverridingFunction))
OverridingFunction{_charStreamProvider, m_changes}.analyze(_sourceUnit);
if (isActivated(Module::VirtualFunction))
VirtualFunction{_charStreamProvider, m_changes}.analyze(_sourceUnit);
if (isActivated(Module::DotSyntax))
DotSyntax{_charStreamProvider, m_changes}.analyze(_sourceUnit);
if (isActivated(Module::NowKeyword))
NowKeyword{_charStreamProvider, m_changes}.analyze(_sourceUnit);
if (isActivated(Module::ConstrutorVisibility))
ConstructorVisibility{_charStreamProvider, m_changes}.analyze(_sourceUnit);
}
void activateModule(Module _module) { m_modules.insert(_module); }
void deactivateModules() { m_modules.clear(); }
private:
bool isActivated(Module _module) const
{
return m_modules.find(_module) != m_modules.end();
}
std::set<Module> m_modules = {
Module::ConstructorKeyword,
Module::VisibilitySpecifier,
Module::AbstractContract,
Module::OverridingFunction,
Module::VirtualFunction,
Module::DotSyntax,
Module::NowKeyword,
Module::ConstrutorVisibility
};
};
void tryCompile() const;
void runUpgrade();
bool analyzeAndUpgrade(
std::pair<std::string, std::string> const& _sourceCode
);
void applyChange(
std::pair<std::string, std::string> const& _sourceCode,
UpgradeChange& _change
);
void printErrors() const;
void printStatistics() const;
bool readInputFiles();
bool writeInputFile(std::string const& _path, std::string const& _source);
frontend::ReadCallback::Callback fileReader();
void resetCompiler();
void resetCompiler(frontend::ReadCallback::Callback const& _callback);
boost::program_options::variables_map m_args;
std::map<std::string, std::string> m_sourceCodes;
std::unique_ptr<frontend::CompilerStack> m_compiler;
std::vector<boost::filesystem::path> m_allowedDirectories;
Suite m_suite;
};
}