mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #11984 from ethereum/parse-input-mode-earlier
[CLI] Parse input mode earlier and add some asserts
This commit is contained in:
commit
fc95436704
@ -154,6 +154,8 @@ static bool coloredOutput(CommandLineOptions const& _options)
|
|||||||
|
|
||||||
void CommandLineInterface::handleBinary(string const& _contract)
|
void CommandLineInterface::handleBinary(string const& _contract)
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
if (m_options.compiler.outputs.binary)
|
if (m_options.compiler.outputs.binary)
|
||||||
{
|
{
|
||||||
if (!m_options.output.dir.empty())
|
if (!m_options.output.dir.empty())
|
||||||
@ -178,6 +180,8 @@ void CommandLineInterface::handleBinary(string const& _contract)
|
|||||||
|
|
||||||
void CommandLineInterface::handleOpcode(string const& _contract)
|
void CommandLineInterface::handleOpcode(string const& _contract)
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
if (!m_options.output.dir.empty())
|
if (!m_options.output.dir.empty())
|
||||||
createFile(m_compiler->filesystemFriendlyName(_contract) + ".opcode", evmasm::disassemble(m_compiler->object(_contract).bytecode));
|
createFile(m_compiler->filesystemFriendlyName(_contract) + ".opcode", evmasm::disassemble(m_compiler->object(_contract).bytecode));
|
||||||
else
|
else
|
||||||
@ -190,6 +194,8 @@ void CommandLineInterface::handleOpcode(string const& _contract)
|
|||||||
|
|
||||||
void CommandLineInterface::handleIR(string const& _contractName)
|
void CommandLineInterface::handleIR(string const& _contractName)
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
if (!m_options.compiler.outputs.ir)
|
if (!m_options.compiler.outputs.ir)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -204,6 +210,8 @@ void CommandLineInterface::handleIR(string const& _contractName)
|
|||||||
|
|
||||||
void CommandLineInterface::handleIROptimized(string const& _contractName)
|
void CommandLineInterface::handleIROptimized(string const& _contractName)
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
if (!m_options.compiler.outputs.irOptimized)
|
if (!m_options.compiler.outputs.irOptimized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -218,6 +226,8 @@ void CommandLineInterface::handleIROptimized(string const& _contractName)
|
|||||||
|
|
||||||
void CommandLineInterface::handleEwasm(string const& _contractName)
|
void CommandLineInterface::handleEwasm(string const& _contractName)
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
if (!m_options.compiler.outputs.ewasm)
|
if (!m_options.compiler.outputs.ewasm)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -239,6 +249,8 @@ void CommandLineInterface::handleEwasm(string const& _contractName)
|
|||||||
|
|
||||||
void CommandLineInterface::handleBytecode(string const& _contract)
|
void CommandLineInterface::handleBytecode(string const& _contract)
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
if (m_options.compiler.outputs.opcodes)
|
if (m_options.compiler.outputs.opcodes)
|
||||||
handleOpcode(_contract);
|
handleOpcode(_contract);
|
||||||
if (m_options.compiler.outputs.binary || m_options.compiler.outputs.binaryRuntime)
|
if (m_options.compiler.outputs.binary || m_options.compiler.outputs.binaryRuntime)
|
||||||
@ -247,6 +259,8 @@ void CommandLineInterface::handleBytecode(string const& _contract)
|
|||||||
|
|
||||||
void CommandLineInterface::handleSignatureHashes(string const& _contract)
|
void CommandLineInterface::handleSignatureHashes(string const& _contract)
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
if (!m_options.compiler.outputs.signatureHashes)
|
if (!m_options.compiler.outputs.signatureHashes)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -263,6 +277,8 @@ void CommandLineInterface::handleSignatureHashes(string const& _contract)
|
|||||||
|
|
||||||
void CommandLineInterface::handleMetadata(string const& _contract)
|
void CommandLineInterface::handleMetadata(string const& _contract)
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
if (!m_options.compiler.outputs.metadata)
|
if (!m_options.compiler.outputs.metadata)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -275,6 +291,8 @@ void CommandLineInterface::handleMetadata(string const& _contract)
|
|||||||
|
|
||||||
void CommandLineInterface::handleABI(string const& _contract)
|
void CommandLineInterface::handleABI(string const& _contract)
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
if (!m_options.compiler.outputs.abi)
|
if (!m_options.compiler.outputs.abi)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -287,6 +305,8 @@ void CommandLineInterface::handleABI(string const& _contract)
|
|||||||
|
|
||||||
void CommandLineInterface::handleStorageLayout(string const& _contract)
|
void CommandLineInterface::handleStorageLayout(string const& _contract)
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
if (!m_options.compiler.outputs.storageLayout)
|
if (!m_options.compiler.outputs.storageLayout)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -299,6 +319,8 @@ void CommandLineInterface::handleStorageLayout(string const& _contract)
|
|||||||
|
|
||||||
void CommandLineInterface::handleNatspec(bool _natspecDev, string const& _contract)
|
void CommandLineInterface::handleNatspec(bool _natspecDev, string const& _contract)
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
bool enabled = false;
|
bool enabled = false;
|
||||||
std::string suffix;
|
std::string suffix;
|
||||||
std::string title;
|
std::string title;
|
||||||
@ -339,6 +361,8 @@ void CommandLineInterface::handleNatspec(bool _natspecDev, string const& _contra
|
|||||||
|
|
||||||
void CommandLineInterface::handleGasEstimation(string const& _contract)
|
void CommandLineInterface::handleGasEstimation(string const& _contract)
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
Json::Value estimates = m_compiler->gasEstimates(_contract);
|
Json::Value estimates = m_compiler->gasEstimates(_contract);
|
||||||
sout() << "Gas estimation:" << endl;
|
sout() << "Gas estimation:" << endl;
|
||||||
|
|
||||||
@ -465,6 +489,8 @@ bool CommandLineInterface::readInputFiles()
|
|||||||
|
|
||||||
map<string, Json::Value> CommandLineInterface::parseAstFromInput()
|
map<string, Json::Value> CommandLineInterface::parseAstFromInput()
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
map<string, Json::Value> sourceJsons;
|
map<string, Json::Value> sourceJsons;
|
||||||
map<string, string> tmpSources;
|
map<string, string> tmpSources;
|
||||||
|
|
||||||
@ -711,6 +737,8 @@ bool CommandLineInterface::compile()
|
|||||||
|
|
||||||
void CommandLineInterface::handleCombinedJSON()
|
void CommandLineInterface::handleCombinedJSON()
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
if (!m_options.compiler.combinedJsonRequests.has_value())
|
if (!m_options.compiler.combinedJsonRequests.has_value())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -801,6 +829,8 @@ void CommandLineInterface::handleCombinedJSON()
|
|||||||
|
|
||||||
void CommandLineInterface::handleAst()
|
void CommandLineInterface::handleAst()
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
if (!m_options.compiler.outputs.astCompactJson)
|
if (!m_options.compiler.outputs.astCompactJson)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -848,6 +878,8 @@ bool CommandLineInterface::actOnInput()
|
|||||||
|
|
||||||
bool CommandLineInterface::link()
|
bool CommandLineInterface::link()
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Linker, "");
|
||||||
|
|
||||||
// Map from how the libraries will be named inside the bytecode to their addresses.
|
// Map from how the libraries will be named inside the bytecode to their addresses.
|
||||||
map<string, h160> librariesReplacements;
|
map<string, h160> librariesReplacements;
|
||||||
int const placeholderSize = 40; // 20 bytes or 40 hex characters
|
int const placeholderSize = 40; // 20 bytes or 40 hex characters
|
||||||
@ -911,6 +943,8 @@ bool CommandLineInterface::link()
|
|||||||
|
|
||||||
void CommandLineInterface::writeLinkedFiles()
|
void CommandLineInterface::writeLinkedFiles()
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Linker, "");
|
||||||
|
|
||||||
for (auto const& src: m_fileReader.sourceCodes())
|
for (auto const& src: m_fileReader.sourceCodes())
|
||||||
if (src.first == g_stdinFileName)
|
if (src.first == g_stdinFileName)
|
||||||
sout() << src.second << endl;
|
sout() << src.second << endl;
|
||||||
@ -946,6 +980,8 @@ string CommandLineInterface::objectWithLinkRefsHex(evmasm::LinkerObject const& _
|
|||||||
|
|
||||||
bool CommandLineInterface::assemble(yul::AssemblyStack::Language _language, yul::AssemblyStack::Machine _targetMachine)
|
bool CommandLineInterface::assemble(yul::AssemblyStack::Language _language, yul::AssemblyStack::Machine _targetMachine)
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Assembler, "");
|
||||||
|
|
||||||
bool successful = true;
|
bool successful = true;
|
||||||
map<string, yul::AssemblyStack> assemblyStacks;
|
map<string, yul::AssemblyStack> assemblyStacks;
|
||||||
for (auto const& src: m_fileReader.sourceCodes())
|
for (auto const& src: m_fileReader.sourceCodes())
|
||||||
@ -1088,6 +1124,8 @@ bool CommandLineInterface::assemble(yul::AssemblyStack::Language _language, yul:
|
|||||||
|
|
||||||
void CommandLineInterface::outputCompilationResults()
|
void CommandLineInterface::outputCompilationResults()
|
||||||
{
|
{
|
||||||
|
solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, "");
|
||||||
|
|
||||||
handleCombinedJSON();
|
handleCombinedJSON();
|
||||||
|
|
||||||
// do we need AST output?
|
// do we need AST output?
|
||||||
|
@ -323,6 +323,16 @@ OptimiserSettings CommandLineOptions::optimiserSettings() const
|
|||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CommandLineParser::parse(int _argc, char const* const* _argv, bool _interactiveTerminal)
|
||||||
|
{
|
||||||
|
m_hasOutput = false;
|
||||||
|
|
||||||
|
if (!parseArgs(_argc, _argv, _interactiveTerminal))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return processArgs();
|
||||||
|
}
|
||||||
|
|
||||||
bool CommandLineParser::parseInputPathsAndRemappings()
|
bool CommandLineParser::parseInputPathsAndRemappings()
|
||||||
{
|
{
|
||||||
m_options.input.ignoreMissingFiles = (m_args.count(g_strIgnoreMissingFiles) > 0);
|
m_options.input.ignoreMissingFiles = (m_args.count(g_strIgnoreMissingFiles) > 0);
|
||||||
@ -478,10 +488,8 @@ bool CommandLineParser::parseLibraryOption(string const& _input)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CommandLineParser::parse(int _argc, char const* const* _argv, bool interactiveTerminal)
|
po::options_description CommandLineParser::optionsDescription()
|
||||||
{
|
{
|
||||||
m_hasOutput = false;
|
|
||||||
|
|
||||||
// Declare the supported options.
|
// Declare the supported options.
|
||||||
po::options_description desc((R"(solc, the Solidity commandline compiler.
|
po::options_description desc((R"(solc, the Solidity commandline compiler.
|
||||||
|
|
||||||
@ -780,12 +788,22 @@ General Information)").c_str(),
|
|||||||
;
|
;
|
||||||
desc.add(smtCheckerOptions);
|
desc.add(smtCheckerOptions);
|
||||||
|
|
||||||
po::options_description allOptions = desc;
|
desc.add_options()(g_strInputFile.c_str(), po::value<vector<string>>(), "input file");
|
||||||
allOptions.add_options()(g_strInputFile.c_str(), po::value<vector<string>>(), "input file");
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
po::positional_options_description CommandLineParser::positionalOptionsDescription()
|
||||||
|
{
|
||||||
// All positional options should be interpreted as input files
|
// All positional options should be interpreted as input files
|
||||||
po::positional_options_description filesPositions;
|
po::positional_options_description filesPositions;
|
||||||
filesPositions.add(g_strInputFile.c_str(), -1);
|
filesPositions.add(g_strInputFile.c_str(), -1);
|
||||||
|
return filesPositions;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CommandLineParser::parseArgs(int _argc, char const* const* _argv, bool _interactiveTerminal)
|
||||||
|
{
|
||||||
|
po::options_description allOptions = optionsDescription();
|
||||||
|
po::positional_options_description filesPositions = positionalOptionsDescription();
|
||||||
|
|
||||||
// parse the compiler arguments
|
// parse the compiler arguments
|
||||||
try
|
try
|
||||||
@ -801,6 +819,56 @@ General Information)").c_str(),
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_args.count(g_strHelp) || (_interactiveTerminal && _argc == 1))
|
||||||
|
{
|
||||||
|
sout() << allOptions;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_args.count(g_strVersion))
|
||||||
|
printVersionAndExit();
|
||||||
|
|
||||||
|
if (m_args.count(g_strLicense))
|
||||||
|
printLicenseAndExit();
|
||||||
|
|
||||||
|
po::notify(m_args);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CommandLineParser::processArgs()
|
||||||
|
{
|
||||||
|
if (!checkMutuallyExclusive({
|
||||||
|
g_strStandardJSON,
|
||||||
|
g_strLink,
|
||||||
|
g_strAssemble,
|
||||||
|
g_strStrictAssembly,
|
||||||
|
g_strYul,
|
||||||
|
g_strImportAst,
|
||||||
|
}))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (m_args.count(g_strStandardJSON) > 0)
|
||||||
|
m_options.input.mode = InputMode::StandardJson;
|
||||||
|
else if (m_args.count(g_strAssemble) > 0 || m_args.count(g_strStrictAssembly) > 0 || m_args.count(g_strYul) > 0)
|
||||||
|
m_options.input.mode = InputMode::Assembler;
|
||||||
|
else if (m_args.count(g_strLink) > 0)
|
||||||
|
m_options.input.mode = InputMode::Linker;
|
||||||
|
else if (m_args.count(g_strImportAst) > 0)
|
||||||
|
m_options.input.mode = InputMode::CompilerWithASTImport;
|
||||||
|
else
|
||||||
|
m_options.input.mode = InputMode::Compiler;
|
||||||
|
|
||||||
|
if (
|
||||||
|
m_args.count(g_strExperimentalViaIR) > 0 &&
|
||||||
|
m_options.input.mode != InputMode::Compiler &&
|
||||||
|
m_options.input.mode != InputMode::CompilerWithASTImport
|
||||||
|
)
|
||||||
|
{
|
||||||
|
serr() << "The option --" << g_strExperimentalViaIR << " is only supported in the compiler mode." << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!checkMutuallyExclusive({g_strColor, g_strNoColor}))
|
if (!checkMutuallyExclusive({g_strColor, g_strNoColor}))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -819,6 +887,26 @@ General Information)").c_str(),
|
|||||||
if (!checkMutuallyExclusive({g_strStopAfter, option}))
|
if (!checkMutuallyExclusive({g_strStopAfter, option}))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (
|
||||||
|
m_options.input.mode != InputMode::Compiler &&
|
||||||
|
m_options.input.mode != InputMode::CompilerWithASTImport &&
|
||||||
|
m_options.input.mode != InputMode::Assembler
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (!m_args[g_strOptimizeRuns].defaulted())
|
||||||
|
{
|
||||||
|
serr() << "Option --" << g_strOptimizeRuns << " is only valid in compiler and assembler modes." << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (string const& option: {g_strOptimize, g_strNoOptimizeYul, g_strOptimizeYul, g_strYulOptimizations})
|
||||||
|
if (m_args.count(option) > 0)
|
||||||
|
{
|
||||||
|
serr() << "Option --" << option << " is only valid in compiler and assembler modes." << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (m_args.count(g_strColor) > 0)
|
if (m_args.count(g_strColor) > 0)
|
||||||
m_options.formatting.coloredOutput = true;
|
m_options.formatting.coloredOutput = true;
|
||||||
else if (m_args.count(g_strNoColor) > 0)
|
else if (m_args.count(g_strNoColor) > 0)
|
||||||
@ -826,18 +914,6 @@ General Information)").c_str(),
|
|||||||
|
|
||||||
m_options.formatting.withErrorIds = m_args.count(g_strErrorIds);
|
m_options.formatting.withErrorIds = m_args.count(g_strErrorIds);
|
||||||
|
|
||||||
if (m_args.count(g_strHelp) || (interactiveTerminal && _argc == 1))
|
|
||||||
{
|
|
||||||
sout() << desc;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_args.count(g_strVersion))
|
|
||||||
printVersionAndExit();
|
|
||||||
|
|
||||||
if (m_args.count(g_strLicense))
|
|
||||||
printLicenseAndExit();
|
|
||||||
|
|
||||||
if (m_args.count(g_strRevertStrings))
|
if (m_args.count(g_strRevertStrings))
|
||||||
{
|
{
|
||||||
string revertStringsString = m_args[g_strRevertStrings].as<string>();
|
string revertStringsString = m_args[g_strRevertStrings].as<string>();
|
||||||
@ -895,8 +971,6 @@ General Information)").c_str(),
|
|||||||
|
|
||||||
m_options.compiler.estimateGas = (m_args.count(g_strGas) > 0);
|
m_options.compiler.estimateGas = (m_args.count(g_strGas) > 0);
|
||||||
|
|
||||||
po::notify(m_args);
|
|
||||||
|
|
||||||
if (m_args.count(g_strBasePath))
|
if (m_args.count(g_strBasePath))
|
||||||
m_options.input.basePath = m_args[g_strBasePath].as<string>();
|
m_options.input.basePath = m_args[g_strBasePath].as<string>();
|
||||||
|
|
||||||
@ -927,60 +1001,9 @@ General Information)").c_str(),
|
|||||||
m_options.output.stopAfter = CompilerStack::State::Parsed;
|
m_options.output.stopAfter = CompilerStack::State::Parsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!checkMutuallyExclusive({
|
|
||||||
g_strStandardJSON,
|
|
||||||
g_strLink,
|
|
||||||
g_strAssemble,
|
|
||||||
g_strStrictAssembly,
|
|
||||||
g_strYul,
|
|
||||||
g_strImportAst,
|
|
||||||
}))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (m_args.count(g_strStandardJSON) > 0)
|
|
||||||
m_options.input.mode = InputMode::StandardJson;
|
|
||||||
else if (m_args.count(g_strAssemble) > 0 || m_args.count(g_strStrictAssembly) > 0 || m_args.count(g_strYul) > 0)
|
|
||||||
m_options.input.mode = InputMode::Assembler;
|
|
||||||
else if (m_args.count(g_strLink) > 0)
|
|
||||||
m_options.input.mode = InputMode::Linker;
|
|
||||||
else if (m_args.count(g_strImportAst) > 0)
|
|
||||||
m_options.input.mode = InputMode::CompilerWithASTImport;
|
|
||||||
else
|
|
||||||
m_options.input.mode = InputMode::Compiler;
|
|
||||||
|
|
||||||
if (
|
|
||||||
m_args.count(g_strExperimentalViaIR) > 0 &&
|
|
||||||
m_options.input.mode != InputMode::Compiler &&
|
|
||||||
m_options.input.mode != InputMode::CompilerWithASTImport
|
|
||||||
)
|
|
||||||
{
|
|
||||||
serr() << "The option --" << g_strExperimentalViaIR << " is only supported in the compiler mode." << endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!parseInputPathsAndRemappings())
|
if (!parseInputPathsAndRemappings())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (
|
|
||||||
m_options.input.mode != InputMode::Compiler &&
|
|
||||||
m_options.input.mode != InputMode::CompilerWithASTImport &&
|
|
||||||
m_options.input.mode != InputMode::Assembler
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if (!m_args[g_strOptimizeRuns].defaulted())
|
|
||||||
{
|
|
||||||
serr() << "Option --" << g_strOptimizeRuns << " is only valid in compiler and assembler modes." << endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (string const& option: {g_strOptimize, g_strNoOptimizeYul, g_strOptimizeYul, g_strYulOptimizations})
|
|
||||||
if (m_args.count(option) > 0)
|
|
||||||
{
|
|
||||||
serr() << "Option --" << option << " is only valid in compiler and assembler modes." << endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_options.input.mode == InputMode::StandardJson)
|
if (m_options.input.mode == InputMode::StandardJson)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -195,7 +195,7 @@ public:
|
|||||||
/// CommandLineOptions structure has been fully initialized. false if there were errors - in
|
/// CommandLineOptions structure has been fully initialized. false if there were errors - in
|
||||||
/// this case CommandLineOptions may be only partially filled out. May also return false if
|
/// this case CommandLineOptions may be only partially filled out. May also return false if
|
||||||
/// there is not further processing necessary and the program should just exit.
|
/// there is not further processing necessary and the program should just exit.
|
||||||
bool parse(int _argc, char const* const* _argv, bool interactiveTerminal);
|
bool parse(int _argc, char const* const* _argv, bool _interactiveTerminal);
|
||||||
|
|
||||||
CommandLineOptions const& options() const { return m_options; }
|
CommandLineOptions const& options() const { return m_options; }
|
||||||
|
|
||||||
@ -203,6 +203,24 @@ public:
|
|||||||
bool hasOutput() const { return m_hasOutput; }
|
bool hasOutput() const { return m_hasOutput; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/// @returns a specification of all named command-line options accepted by the compiler.
|
||||||
|
/// The object can be used to parse command-line arguments or to generate the help screen.
|
||||||
|
static boost::program_options::options_description optionsDescription();
|
||||||
|
|
||||||
|
/// @returns a specification of all positional command-line arguments accepted by the compiler.
|
||||||
|
/// The object can be used to parse command-line arguments or to generate the help screen.
|
||||||
|
static boost::program_options::positional_options_description positionalOptionsDescription();
|
||||||
|
|
||||||
|
/// Uses boost::program_options to parse the command-line arguments and leaves the result in @a m_args.
|
||||||
|
/// Also handles the arguments that result in information being printed followed by immediate exit.
|
||||||
|
/// @returns false if parsing fails due to syntactical errors or the arguments not matching the description.
|
||||||
|
bool parseArgs(int _argc, char const* const* _argv, bool _interactiveTerminal);
|
||||||
|
|
||||||
|
/// Validates parsed arguments stored in @a m_args and fills out the internal CommandLineOptions
|
||||||
|
/// structure.
|
||||||
|
/// @return false if there are any validation errors, true otherwise.
|
||||||
|
bool processArgs();
|
||||||
|
|
||||||
/// Parses the value supplied to --combined-json.
|
/// Parses the value supplied to --combined-json.
|
||||||
/// @return false if there are any validation errors, true otherwise.
|
/// @return false if there are any validation errors, true otherwise.
|
||||||
bool parseCombinedJsonOption();
|
bool parseCombinedJsonOption();
|
||||||
|
Loading…
Reference in New Issue
Block a user