solidity/libyul/Utilities.h
Christian Parpart 0fd1db533e yul: adds reindent() function to reindent yul source code and makes use of it in IRGenerator.
This function does count curly and round braces and reindents
accordingly the beginning of each line.

It does consider line-comments (// and ///) but not multiline comments (/* ... */).
2019-06-24 12:53:50 +02:00

72 lines
2.0 KiB
C++

/*
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 <http://www.gnu.org/licenses/>.
*/
/**
* Small useful snippets for the optimiser.
*/
#pragma once
#include <libdevcore/Common.h>
#include <libyul/AsmDataForward.h>
namespace yul
{
std::string reindent(std::string const& _code);
dev::u256 valueOfNumberLiteral(Literal const& _literal);
dev::u256 valueOfStringLiteral(Literal const& _literal);
dev::u256 valueOfBoolLiteral(Literal const& _literal);
dev::u256 valueOfLiteral(Literal const& _literal);
/**
* Linear order on Yul AST nodes.
*
* Defines a linear order on Yul AST nodes to be used in maps and sets.
* Note: the order is total and deterministic, but independent of the semantics, e.g.
* it is not guaranteed that the false Literal is "less" than the true Literal.
*/
template<typename T>
struct Less
{
bool operator()(T const& _lhs, T const& _rhs) const;
};
template<typename T>
struct Less<T*>
{
bool operator()(T const* _lhs, T const* _rhs) const
{
if (_lhs && _rhs)
return Less<T>{}(*_lhs, *_rhs);
else
return _lhs < _rhs;
}
};
template<> bool Less<Literal>::operator()(Literal const& _lhs, Literal const& _rhs) const;
extern template struct Less<Literal>;
// This can only be used for cases within one switch statement and
// relies on the fact that there are no duplicate cases.
struct SwitchCaseCompareByLiteralValue
{
bool operator()(Case const* _lhsCase, Case const* _rhsCase) const;
};
}