mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Introduce view (and keep constant as an alias)
This commit is contained in:
parent
210b4870a8
commit
efe4d68a7b
@ -3,6 +3,7 @@
|
||||
Features:
|
||||
* ABI JSON: Include new field ``statemutability`` with values ``view``, ``nonpayable`` and ``payable``.
|
||||
* Parser: Display previous visibility specifier in error if multiple are found.
|
||||
* Parser: Introduce ``view`` keyword on functions (``constant`` remains an alias for ``view``).
|
||||
* Syntax Checker: Support ``pragma experimental <feature>;`` to turn on experimental features.
|
||||
* Static Analyzer: Warn about large storage structures.
|
||||
* Metadata: Store experimental flag in metadata CBOR.
|
||||
|
@ -337,7 +337,7 @@ be passed via and returned from external function calls.
|
||||
|
||||
Function types are notated as follows::
|
||||
|
||||
function (<parameter types>) {internal|external} [constant|payable] [returns (<return types>)]
|
||||
function (<parameter types>) {internal|external} [constant|view|payable] [returns (<return types>)]
|
||||
|
||||
In contrast to the parameter types, the return types cannot be empty - if the
|
||||
function type should not return anything, the whole ``returns (<return types>)``
|
||||
|
@ -323,6 +323,7 @@ bool ASTJsonConverter::visit(FunctionDefinition const& _node)
|
||||
{
|
||||
std::vector<pair<string, Json::Value>> attributes = {
|
||||
make_pair("name", _node.name()),
|
||||
// FIXME: remove with next breaking release
|
||||
make_pair(m_legacy ? "constant" : "isDeclaredConst", _node.stateMutability() == StateMutability::View),
|
||||
make_pair("payable", _node.isPayable()),
|
||||
make_pair("statemutability", stateMutabilityToString(_node.stateMutability())),
|
||||
@ -415,6 +416,7 @@ bool ASTJsonConverter::visit(FunctionTypeName const& _node)
|
||||
make_pair("payable", _node.isPayable()),
|
||||
make_pair("visibility", Declaration::visibilityToString(_node.visibility())),
|
||||
make_pair("statemutability", stateMutabilityToString(_node.stateMutability())),
|
||||
// FIXME: remove with next breaking release
|
||||
make_pair(m_legacy ? "constant" : "isDeclaredConst", _node.stateMutability() == StateMutability::View),
|
||||
make_pair("parameterTypes", toJson(*_node.parameterTypeList())),
|
||||
make_pair("returnParameterTypes", toJson(*_node.returnParameterTypeList())),
|
||||
|
@ -993,7 +993,6 @@ public:
|
||||
return *m_declaration;
|
||||
}
|
||||
bool hasDeclaration() const { return !!m_declaration; }
|
||||
bool isConstant() const { return m_stateMutability == StateMutability::View; }
|
||||
/// @returns true if the the result of this function only depends on its arguments
|
||||
/// and it does not modify the state.
|
||||
/// Currently, this will only return true for internal functions like keccak and ecrecover.
|
||||
|
@ -35,7 +35,8 @@ Json::Value ABI::generate(ContractDefinition const& _contractDef)
|
||||
Json::Value method;
|
||||
method["type"] = "function";
|
||||
method["name"] = it.second->declaration().name();
|
||||
method["constant"] = it.second->isConstant();
|
||||
// TODO: deprecate constant in a future release
|
||||
method["constant"] = it.second->stateMutability() == StateMutability::View;
|
||||
method["payable"] = it.second->isPayable();
|
||||
method["statemutability"] = stateMutabilityToString(it.second->stateMutability());
|
||||
method["inputs"] = formatTypeList(
|
||||
|
@ -337,7 +337,8 @@ StateMutability Parser::parseStateMutability(Token::Value _token)
|
||||
StateMutability stateMutability(StateMutability::NonPayable);
|
||||
if (_token == Token::Payable)
|
||||
stateMutability = StateMutability::Payable;
|
||||
else if (_token == Token::Constant)
|
||||
// FIXME: constant should be removed at the next breaking release
|
||||
else if (_token == Token::View || _token == Token::Constant)
|
||||
stateMutability = StateMutability::View;
|
||||
else
|
||||
solAssert(false, "Invalid state mutability specifier.");
|
||||
|
@ -176,6 +176,7 @@ namespace solidity
|
||||
K(Throw, "throw", 0) \
|
||||
K(Using, "using", 0) \
|
||||
K(Var, "var", 0) \
|
||||
K(View, "view", 0) \
|
||||
K(While, "while", 0) \
|
||||
\
|
||||
/* Ether subdenominations */ \
|
||||
@ -236,7 +237,6 @@ namespace solidity
|
||||
K(Try, "try", 0) \
|
||||
K(Type, "type", 0) \
|
||||
K(TypeOf, "typeof", 0) \
|
||||
K(View, "view", 0) \
|
||||
/* Illegal token - not able to scan. */ \
|
||||
T(Illegal, "ILLEGAL", 0) \
|
||||
\
|
||||
@ -290,7 +290,7 @@ public:
|
||||
static bool isVisibilitySpecifier(Value op) { return isVariableVisibilitySpecifier(op) || op == External; }
|
||||
static bool isVariableVisibilitySpecifier(Value op) { return op == Public || op == Private || op == Internal; }
|
||||
static bool isLocationSpecifier(Value op) { return op == Memory || op == Storage; }
|
||||
static bool isStateMutabilitySpecifier(Value op) { return op == Constant || op == Payable; }
|
||||
static bool isStateMutabilitySpecifier(Value op) { return op == Constant || op == View || op == Payable; }
|
||||
static bool isEtherSubdenomination(Value op) { return op == SubWei || op == SubSzabo || op == SubFinney || op == SubEther; }
|
||||
static bool isTimeSubdenomination(Value op) { return op == SubSecond || op == SubMinute || op == SubHour || op == SubDay || op == SubWeek || op == SubYear; }
|
||||
static bool isReservedKeyword(Value op) { return (Abstract <= op && op <= TypeOf); }
|
||||
|
@ -1172,7 +1172,7 @@ BOOST_AUTO_TEST_CASE(state_variable_accessors)
|
||||
BOOST_REQUIRE(function && function->hasDeclaration());
|
||||
auto returnParams = function->returnParameterTypes();
|
||||
BOOST_CHECK_EQUAL(returnParams.at(0)->canonicalName(false), "uint256");
|
||||
BOOST_CHECK(function->isConstant());
|
||||
BOOST_CHECK(function->stateMutability() == StateMutability::View);
|
||||
|
||||
function = retrieveFunctionBySignature(*contract, "map(uint256)");
|
||||
BOOST_REQUIRE(function && function->hasDeclaration());
|
||||
@ -1180,7 +1180,7 @@ BOOST_AUTO_TEST_CASE(state_variable_accessors)
|
||||
BOOST_CHECK_EQUAL(params.at(0)->canonicalName(false), "uint256");
|
||||
returnParams = function->returnParameterTypes();
|
||||
BOOST_CHECK_EQUAL(returnParams.at(0)->canonicalName(false), "bytes4");
|
||||
BOOST_CHECK(function->isConstant());
|
||||
BOOST_CHECK(function->stateMutability() == StateMutability::View);
|
||||
|
||||
function = retrieveFunctionBySignature(*contract, "multiple_map(uint256,uint256)");
|
||||
BOOST_REQUIRE(function && function->hasDeclaration());
|
||||
@ -1189,7 +1189,7 @@ BOOST_AUTO_TEST_CASE(state_variable_accessors)
|
||||
BOOST_CHECK_EQUAL(params.at(1)->canonicalName(false), "uint256");
|
||||
returnParams = function->returnParameterTypes();
|
||||
BOOST_CHECK_EQUAL(returnParams.at(0)->canonicalName(false), "bytes4");
|
||||
BOOST_CHECK(function->isConstant());
|
||||
BOOST_CHECK(function->stateMutability() == StateMutability::View);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(function_clash_with_state_variable_accessor)
|
||||
|
Loading…
Reference in New Issue
Block a user