#pragma once
#include <solc/CommandLineParser.h>
#include <libsolidity/interface/CompilerStack.h>
#include <libsolidity/interface/DebugSettings.h>
#include <libsolidity/interface/FileReader.h>
#include <libyul/YulStack.h>
#include <iostream>
#include <memory>
#include <string>
namespace solidity::frontend
{
class CommandLineInterface
{
public:
explicit CommandLineInterface(
std::istream& _sin,
std::ostream& _sout,
std::ostream& _serr,
CommandLineOptions const& _options = CommandLineOptions{}
):
m_sin(_sin),
m_sout(_sout),
m_serr(_serr),
m_options(_options)
{}
bool run(int _argc, char const* const* _argv);
bool parseArguments(int _argc, char const* const* _argv);
void readInputFiles();
void processInput();
CommandLineOptions const& options() const { return m_options; }
FileReader const& fileReader() const { return m_fileReader; }
std::optional<std::string> const& standardJsonInput() const { return m_standardJsonInput; }
private:
void printVersion();
void printLicense();
void compile();
void serveLSP();
void link();
void writeLinkedFiles();
static std::string libraryPlaceholderHint(std::string const& _libraryName);
static std::string objectWithLinkRefsHex(evmasm::LinkerObject const& _obj);
void assemble(yul::YulStack::Language _language, yul::YulStack::Machine _targetMachine);
void outputCompilationResults();
void handleCombinedJSON();
void handleAst();
void handleBinary(std::string const& _contract);
void handleOpcode(std::string const& _contract);
void handleIR(std::string const& _contract);
void handleIROptimized(std::string const& _contract);
void handleEwasm(std::string const& _contract);
void handleBytecode(std::string const& _contract);
void handleSignatureHashes(std::string const& _contract);
void handleMetadata(std::string const& _contract);
void handleABI(std::string const& _contract);
void handleNatspec(bool _natspecDev, std::string const& _contract);
void handleGasEstimation(std::string const& _contract);
void handleStorageLayout(std::string const& _contract);
std::map<std::string, Json::Value> parseAstFromInput();
void createFile(std::string const& _fileName, std::string const& _data);
void createJson(std::string const& _fileName, std::string const& _json);
std::ostream& sout(bool _markAsUsed = true);
std::ostream& serr(bool _markAsUsed = true);
std::istream& m_sin;
std::ostream& m_sout;
std::ostream& m_serr;
bool m_hasOutput = false;
FileReader m_fileReader;
std::optional<std::string> m_standardJsonInput;
std::unique_ptr<frontend::CompilerStack> m_compiler;
CommandLineOptions m_options;
};
}