mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Add block statement
This commit is contained in:
parent
46bac2377f
commit
a115e61be6
@ -41,9 +41,11 @@
|
||||
*
|
||||
*/
|
||||
#define GENERATORLIST(MACRO, SEP, ENDSEP) \
|
||||
MACRO(BlockStmtGenerator) SEP \
|
||||
MACRO(ContractGenerator) SEP \
|
||||
MACRO(FunctionGenerator) SEP \
|
||||
MACRO(ImportGenerator) SEP \
|
||||
MACRO(PragmaGenerator) SEP \
|
||||
MACRO(SourceUnitGenerator) SEP \
|
||||
MACRO(StatementGenerator) SEP \
|
||||
MACRO(TestCaseGenerator) ENDSEP
|
||||
|
@ -263,6 +263,16 @@ string FunctionState::params(Params _p)
|
||||
return "(" + boost::algorithm::join(params, ",") + ")";
|
||||
}
|
||||
|
||||
string BlockStmtGenerator::visit()
|
||||
{
|
||||
return "\n" + indentation() + "{}\n";
|
||||
}
|
||||
|
||||
void FunctionGenerator::setup()
|
||||
{
|
||||
addGenerators({{mutator->generator<BlockStmtGenerator>(), 1}});
|
||||
}
|
||||
|
||||
string FunctionGenerator::visit()
|
||||
{
|
||||
string visibility;
|
||||
@ -281,7 +291,7 @@ string FunctionGenerator::visit()
|
||||
state->currentFunctionState()->addOutput(TypeProvider{state}.type());
|
||||
|
||||
ostringstream function;
|
||||
function << indentation(state->indentationLevel)
|
||||
function << indentation()
|
||||
<< "function "
|
||||
<< name
|
||||
<< state->currentFunctionState()->params(FunctionState::Params::INPUT)
|
||||
@ -291,7 +301,7 @@ string FunctionGenerator::visit()
|
||||
if (!state->currentFunctionState()->outputs.empty())
|
||||
function << " returns"
|
||||
<< state->currentFunctionState()->params(FunctionState::Params::OUTPUT);
|
||||
function << " {}\n";
|
||||
function << generator<BlockStmtGenerator>()->visit();
|
||||
return function.str();
|
||||
}
|
||||
|
||||
|
@ -648,11 +648,11 @@ struct GeneratorBase
|
||||
endVisit();
|
||||
return generatedCode;
|
||||
}
|
||||
/// @returns indentation as string. Each indentation level comprises two
|
||||
/// whitespace characters.
|
||||
std::string indentation(unsigned _indentationLevel)
|
||||
/// @returns current indentation as string. Each indentation level comprises
|
||||
/// two whitespace characters.
|
||||
std::string indentation()
|
||||
{
|
||||
return std::string(_indentationLevel * 2, ' ');
|
||||
return std::string(state->indentationLevel * 2, ' ');
|
||||
}
|
||||
/// @returns a string representing the generation of
|
||||
/// the Solidity grammar element.
|
||||
@ -791,6 +791,7 @@ public:
|
||||
{}
|
||||
std::string visit() override;
|
||||
std::string name() override { return "Function generator"; }
|
||||
void setup() override;
|
||||
/// Sets @name m_freeFunction to @param _freeFunction.
|
||||
void scope(bool _freeFunction)
|
||||
{
|
||||
@ -800,6 +801,28 @@ private:
|
||||
bool m_freeFunction;
|
||||
static constexpr unsigned s_maxInputs = 4;
|
||||
static constexpr unsigned s_maxOutputs = 4;
|
||||
static constexpr unsigned s_maxStatements = 5;
|
||||
};
|
||||
|
||||
class StatementGenerator: public GeneratorBase
|
||||
{
|
||||
public:
|
||||
explicit StatementGenerator(std::shared_ptr<SolidityGenerator> _mutator):
|
||||
GeneratorBase(std::move(_mutator))
|
||||
{}
|
||||
void setup() override {}
|
||||
std::string visit() override { return {}; }
|
||||
std::string name() override { return "Statement generator"; }
|
||||
};
|
||||
|
||||
class BlockStmtGenerator: public GeneratorBase
|
||||
{
|
||||
public:
|
||||
explicit BlockStmtGenerator(std::shared_ptr<SolidityGenerator> _mutator):
|
||||
GeneratorBase(std::move(_mutator))
|
||||
{}
|
||||
std::string visit() override;
|
||||
std::string name() override { return "Block statement generator"; }
|
||||
};
|
||||
|
||||
class SolidityGenerator: public std::enable_shared_from_this<SolidityGenerator>
|
||||
|
Loading…
Reference in New Issue
Block a user