mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Promote gwei to a proper keyword.
This commit is contained in:
parent
38c6ecbbe2
commit
c3e13b6733
@ -5,6 +5,7 @@ Breaking changes:
|
|||||||
* Constructors should not have visibility.
|
* Constructors should not have visibility.
|
||||||
* Deprecated dot syntax for `value` and `gas`.
|
* Deprecated dot syntax for `value` and `gas`.
|
||||||
* Deprecated the identifier `now`.
|
* Deprecated the identifier `now`.
|
||||||
|
* Disallow `gwei` as identifier.
|
||||||
* JSON AST: Removes members with ``null`` value from JSON output.
|
* JSON AST: Removes members with ``null`` value from JSON output.
|
||||||
* Parser: NatSpec comments on variables are only allowed for public state variables.
|
* Parser: NatSpec comments on variables are only allowed for public state variables.
|
||||||
* Type Checker: Disallow shifts by signed types.
|
* Type Checker: Disallow shifts by signed types.
|
||||||
|
@ -196,6 +196,7 @@ namespace solidity::langutil
|
|||||||
\
|
\
|
||||||
/* Ether subdenominations */ \
|
/* Ether subdenominations */ \
|
||||||
K(SubWei, "wei", 0) \
|
K(SubWei, "wei", 0) \
|
||||||
|
K(SubGwei, "gwei", 0) \
|
||||||
K(SubEther, "ether", 0) \
|
K(SubEther, "ether", 0) \
|
||||||
K(SubSecond, "seconds", 0) \
|
K(SubSecond, "seconds", 0) \
|
||||||
K(SubMinute, "minutes", 0) \
|
K(SubMinute, "minutes", 0) \
|
||||||
@ -230,7 +231,6 @@ namespace solidity::langutil
|
|||||||
\
|
\
|
||||||
/* Identifiers (not keywords or future reserved words). */ \
|
/* Identifiers (not keywords or future reserved words). */ \
|
||||||
T(Identifier, nullptr, 0) \
|
T(Identifier, nullptr, 0) \
|
||||||
T(SubGwei, "gwei", 0) \
|
|
||||||
\
|
\
|
||||||
/* Keywords reserved for future use. */ \
|
/* Keywords reserved for future use. */ \
|
||||||
K(After, "after", 0) \
|
K(After, "after", 0) \
|
||||||
@ -311,7 +311,7 @@ namespace TokenTraits
|
|||||||
|| op == Token::Pure || op == Token::View || op == Token::Payable;
|
|| op == Token::Pure || op == Token::View || op == Token::Payable;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr bool isEtherSubdenomination(Token op) { return op == Token::SubWei || op == Token::SubEther; }
|
constexpr bool isEtherSubdenomination(Token op) { return op >= Token::SubWei && op <= Token::SubEther; }
|
||||||
constexpr bool isTimeSubdenomination(Token op) { return op == Token::SubSecond || op == Token::SubMinute || op == Token::SubHour || op == Token::SubDay || op == Token::SubWeek || op == Token::SubYear; }
|
constexpr bool isTimeSubdenomination(Token op) { return op == Token::SubSecond || op == Token::SubMinute || op == Token::SubHour || op == Token::SubDay || op == Token::SubWeek || op == Token::SubYear; }
|
||||||
constexpr bool isReservedKeyword(Token op) { return (Token::After <= op && op <= Token::Unchecked); }
|
constexpr bool isReservedKeyword(Token op) { return (Token::After <= op && op <= Token::Unchecked); }
|
||||||
|
|
||||||
|
@ -1825,16 +1825,11 @@ ASTPointer<Expression> Parser::parsePrimaryExpression()
|
|||||||
expression = nodeFactory.createNode<Literal>(token, getLiteralAndAdvance());
|
expression = nodeFactory.createNode<Literal>(token, getLiteralAndAdvance());
|
||||||
break;
|
break;
|
||||||
case Token::Number:
|
case Token::Number:
|
||||||
if (
|
if (TokenTraits::isEtherSubdenomination(m_scanner->peekNextToken()))
|
||||||
(m_scanner->peekNextToken() == Token::Identifier && m_scanner->peekLiteral() == "gwei") ||
|
|
||||||
TokenTraits::isEtherSubdenomination(m_scanner->peekNextToken())
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
ASTPointer<ASTString> literal = getLiteralAndAdvance();
|
ASTPointer<ASTString> literal = getLiteralAndAdvance();
|
||||||
nodeFactory.markEndPosition();
|
nodeFactory.markEndPosition();
|
||||||
Token actualToken = m_scanner->currentToken() == Token::Identifier ? Token::SubGwei : m_scanner->currentToken();
|
Literal::SubDenomination subdenomination = static_cast<Literal::SubDenomination>(m_scanner->currentToken());
|
||||||
|
|
||||||
Literal::SubDenomination subdenomination = static_cast<Literal::SubDenomination>(actualToken);
|
|
||||||
m_scanner->next();
|
m_scanner->next();
|
||||||
expression = nodeFactory.createNode<Literal>(token, literal, subdenomination);
|
expression = nodeFactory.createNode<Literal>(token, literal, subdenomination);
|
||||||
}
|
}
|
||||||
|
@ -430,7 +430,7 @@ BOOST_AUTO_TEST_CASE(ether_subdenominations)
|
|||||||
{
|
{
|
||||||
Scanner scanner(CharStream("wei gwei ether", ""));
|
Scanner scanner(CharStream("wei gwei ether", ""));
|
||||||
BOOST_CHECK_EQUAL(scanner.currentToken(), Token::SubWei);
|
BOOST_CHECK_EQUAL(scanner.currentToken(), Token::SubWei);
|
||||||
BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
|
BOOST_CHECK_EQUAL(scanner.next(), Token::SubGwei);
|
||||||
BOOST_CHECK_EQUAL(scanner.next(), Token::SubEther);
|
BOOST_CHECK_EQUAL(scanner.next(), Token::SubEther);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
contract C {
|
contract C {
|
||||||
uint constant gwei = 1 gwei;
|
uint constant x = 1 gwei;
|
||||||
|
|
||||||
function f() public view returns(uint) { return gwei; }
|
function f() public view returns(uint) { return x; }
|
||||||
}
|
}
|
||||||
// ====
|
// ====
|
||||||
// compileViaYul: also
|
// compileViaYul: also
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
contract C {
|
|
||||||
uint constant gwei = 1 gwei;
|
|
||||||
}
|
|
@ -0,0 +1,5 @@
|
|||||||
|
contract C {
|
||||||
|
uint constant gwei = 1;
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// ParserError 2314: (28-32): Expected identifier but got 'gwei'
|
Loading…
Reference in New Issue
Block a user