diff options
author | chriseth <chris@ethereum.org> | 2018-02-23 05:42:04 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-23 05:42:04 +0800 |
commit | 2b62c201be166222f05acfa8422b1968f2cf924a (patch) | |
tree | 501613fa210a9c0f9e74f1f277ccb6a117d5c639 /libsolidity/parsing | |
parent | 97d1c70491c027051feac065c827b223ce6acf11 (diff) | |
parent | b5a3b6a4293537c843e8387ffd0b03253160dc0a (diff) | |
download | dexon-solidity-2b62c201be166222f05acfa8422b1968f2cf924a.tar dexon-solidity-2b62c201be166222f05acfa8422b1968f2cf924a.tar.gz dexon-solidity-2b62c201be166222f05acfa8422b1968f2cf924a.tar.bz2 dexon-solidity-2b62c201be166222f05acfa8422b1968f2cf924a.tar.lz dexon-solidity-2b62c201be166222f05acfa8422b1968f2cf924a.tar.xz dexon-solidity-2b62c201be166222f05acfa8422b1968f2cf924a.tar.zst dexon-solidity-2b62c201be166222f05acfa8422b1968f2cf924a.zip |
Merge pull request #3538 from ethereum/emitEvents
emit pseudo-keyword for events.
Diffstat (limited to 'libsolidity/parsing')
-rw-r--r-- | libsolidity/parsing/Parser.cpp | 36 | ||||
-rw-r--r-- | libsolidity/parsing/Parser.h | 1 |
2 files changed, 36 insertions, 1 deletions
diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp index e306e21b..8c97f55f 100644 --- a/libsolidity/parsing/Parser.cpp +++ b/libsolidity/parsing/Parser.cpp @@ -897,7 +897,9 @@ ASTPointer<Statement> Parser::parseStatement() case Token::Assembly: return parseInlineAssembly(docString); case Token::Identifier: - if (m_insideModifier && m_scanner->currentLiteral() == "_") + if (m_scanner->currentLiteral() == "emit") + statement = parseEmitStatement(docString); + else if (m_insideModifier && m_scanner->currentLiteral() == "_") { statement = ASTNodeFactory(*this).createNode<PlaceholderStatement>(docString); m_scanner->next(); @@ -1015,6 +1017,38 @@ ASTPointer<ForStatement> Parser::parseForStatement(ASTPointer<ASTString> const& ); } +ASTPointer<EmitStatement> Parser::parseEmitStatement(ASTPointer<ASTString> const& _docString) +{ + ASTNodeFactory nodeFactory(*this); + m_scanner->next(); + ASTNodeFactory eventCallNodeFactory(*this); + + if (m_scanner->currentToken() != Token::Identifier) + fatalParserError("Expected event name or path."); + + vector<ASTPointer<PrimaryExpression>> path; + while (true) + { + path.push_back(parseIdentifier()); + if (m_scanner->currentToken() != Token::Period) + break; + m_scanner->next(); + }; + + auto eventName = expressionFromIndexAccessStructure(path, {}); + expectToken(Token::LParen); + + vector<ASTPointer<Expression>> arguments; + vector<ASTPointer<ASTString>> names; + std::tie(arguments, names) = parseFunctionCallArguments(); + eventCallNodeFactory.markEndPosition(); + nodeFactory.markEndPosition(); + expectToken(Token::RParen); + auto eventCall = eventCallNodeFactory.createNode<FunctionCall>(eventName, arguments, names); + auto statement = nodeFactory.createNode<EmitStatement>(_docString, eventCall); + return statement; +} + ASTPointer<Statement> Parser::parseSimpleStatement(ASTPointer<ASTString> const& _docString) { RecursionGuard recursionGuard(*this); diff --git a/libsolidity/parsing/Parser.h b/libsolidity/parsing/Parser.h index cfdfea7e..3f780af9 100644 --- a/libsolidity/parsing/Parser.h +++ b/libsolidity/parsing/Parser.h @@ -104,6 +104,7 @@ private: ASTPointer<WhileStatement> parseWhileStatement(ASTPointer<ASTString> const& _docString); ASTPointer<WhileStatement> parseDoWhileStatement(ASTPointer<ASTString> const& _docString); ASTPointer<ForStatement> parseForStatement(ASTPointer<ASTString> const& _docString); + ASTPointer<EmitStatement> parseEmitStatement(ASTPointer<ASTString> const& docString); /// A "simple statement" can be a variable declaration statement or an expression statement. ASTPointer<Statement> parseSimpleStatement(ASTPointer<ASTString> const& _docString); ASTPointer<VariableDeclarationStatement> parseVariableDeclarationStatement( |