/*
This file is part of solidity.
solidity is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
solidity is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with solidity. If not, see .
*/
#include
#include
#include
namespace solidity::test::solprotofuzzer
{
struct ProgramInfo
{
enum class ProgramType
{
LIBRARY,
CONTRACT,
INTERFACE
};
std::string m_name;
std::string m_userDefinedTypes;
ProgramType m_programType;
};
struct FunctionInfo
{
enum class FunctionVisibility
{
PUBLIC,
PRIVATE,
INTERNAL,
EXTERNAL
};
enum class StateMutability
{
PURE,
VIEW,
PAYABLE
};
std::string m_name;
std::string m_params;
std::string m_returns;
FunctionVisibility m_visibility;
StateMutability m_mutability;
bool m_override;
bool m_virtual;
};
class ProtoConverter
{
public:
ProtoConverter() {}
ProtoConverter(ProtoConverter const&) = delete;
ProtoConverter(ProtoConverter&&) = delete;
std::string protoToSolidity(Program const&);
private:
using CI = std::variant;
std::string visit(Program const&);
std::string visit(ContractType const&);
std::string visit(ContractOrInterface const&);
std::string visit(Interface const&);
std::string visit(Contract const&);
std::string traverseOverrides(
Interface const&,
bool _isOverride,
bool _implement,
bool _inheritedByContract,
bool _isVirtual
);
std::string traverseOverrides(
Contract const&,
bool _isAbstract
);
std::string visit(Library const&);
std::pair visit(Block const&);
std::pair visit(Statement const&);
std::pair visit(solidity::test::abiv2fuzzer::VarDecl const&, bool _stateVar);
std::pair visit(IfStmt const&);
std::string visit(ForStmt const&);
std::string visit(SwitchStmt const&);
std::string visit(BreakStmt const&);
std::string visit(ContinueStmt const&);
std::string visit(ReturnStmt const&);
std::pair visit(DoStmt const&);
std::pair visit(WhileStmt const&);
std::string visit(Expression const&);
std::string visit(Literal const&);
std::string visit(BinaryOp const&);
std::string visit(UnaryOp const&);
std::string visit(VarRef const&);
std::tuple visit(
FunctionParamsAndReturns const& _pR,
bool _isExternal,
std::string _programName
);
std::string visit(
InterfaceFunction const&,
unsigned _index,
bool _isOverride,
std::string _programName,
bool _implement = false,
bool _inheritedByContract = false,
bool _isVirtual = false
);
std::string visit(LibraryFunction const& _func, unsigned _index, std::string _programName);
std::string visit(
ContractFunction const&,
unsigned _index,
bool _isOverride,
bool _isAbstractContract,
bool _isVirtual,
bool _isImplemented,
std::string _programName
);
std::tuple visitContractHelper(CI _cOrI, std::string _programName);
std::string visit(Modifier const&);
static std::string functionVisibility(ContractFunction::Visibility _vis);
static std::string functionVisibility(LibraryFunction::Visibility _vis);
static std::string stateMutability(ContractFunction::StateMutability _mut);
static std::string stateMutability(LibraryFunction::StateMutability _mut);
static std::string stateMutability(InterfaceFunction::StateMutability _mut);
static bool disallowedContractFunction(ContractFunction const& _contractFunction, bool _isVirtual);
unsigned m_numVars = 0;
unsigned m_numStructs = 0;
unsigned m_numMods = 0;
unsigned m_numContracts = 0;
bool m_isImplemented = false;
std::map m_interfaceNameMap;
std::map m_contractNameMap;
static auto constexpr s_interfaceFunctionPrefix = "i";
static auto constexpr s_libraryFunctionPrefix = "l";
static auto constexpr s_contractFunctionPrefix = "c";
static auto constexpr s_functionPrefix = "func";
};
}