diff options
author | Gav Wood <i@gavwood.com> | 2015-01-30 08:05:17 +0800 |
---|---|---|
committer | Gav Wood <i@gavwood.com> | 2015-01-30 08:05:17 +0800 |
commit | 8e84dc27a7b2bca0148e33209e0f80457cfce74a (patch) | |
tree | c6d9b5be1aebe9723bfa482ac44dff8a8b3c7cad /Parser.cpp | |
parent | f46df7cb92bba6f30184cc47af3aab8cda672048 (diff) | |
parent | dc6f9e3ac0370835b6db8136ba39ea7100ae93a1 (diff) | |
download | dexon-solidity-8e84dc27a7b2bca0148e33209e0f80457cfce74a.tar dexon-solidity-8e84dc27a7b2bca0148e33209e0f80457cfce74a.tar.gz dexon-solidity-8e84dc27a7b2bca0148e33209e0f80457cfce74a.tar.bz2 dexon-solidity-8e84dc27a7b2bca0148e33209e0f80457cfce74a.tar.lz dexon-solidity-8e84dc27a7b2bca0148e33209e0f80457cfce74a.tar.xz dexon-solidity-8e84dc27a7b2bca0148e33209e0f80457cfce74a.tar.zst dexon-solidity-8e84dc27a7b2bca0148e33209e0f80457cfce74a.zip |
Merge branch 'develop' of github.com:ethereum/cpp-ethereum into develop
Conflicts:
test/SolidityEndToEndTest.cpp
test/SolidityNameAndTypeResolution.cpp
test/SolidityParser.cpp
Diffstat (limited to 'Parser.cpp')
-rw-r--r-- | Parser.cpp | 59 |
1 files changed, 45 insertions, 14 deletions
@@ -122,6 +122,7 @@ ASTPointer<ContractDefinition> Parser::parseContractDefinition() vector<ASTPointer<VariableDeclaration>> stateVariables; vector<ASTPointer<FunctionDefinition>> functions; vector<ASTPointer<ModifierDefinition>> modifiers; + vector<ASTPointer<EventDefinition>> events; if (m_scanner->getCurrentToken() == Token::IS) do { @@ -149,19 +150,23 @@ ASTPointer<ContractDefinition> Parser::parseContractDefinition() else if (currentToken == Token::IDENTIFIER || currentToken == Token::MAPPING || Token::isElementaryTypeName(currentToken)) { - bool const allowVar = false; - stateVariables.push_back(parseVariableDeclaration(allowVar, visibilityIsPublic, true)); + VarDeclParserOptions options; + options.isPublic = visibilityIsPublic; + options.isStateVariable = true; + stateVariables.push_back(parseVariableDeclaration(options)); expectToken(Token::SEMICOLON); } else if (currentToken == Token::MODIFIER) modifiers.push_back(parseModifierDefinition()); + else if (currentToken == Token::EVENT) + events.push_back(parseEventDefinition()); else BOOST_THROW_EXCEPTION(createParserError("Function, variable, struct or modifier declaration expected.")); } nodeFactory.markEndPosition(); expectToken(Token::RBRACE); return nodeFactory.createNode<ContractDefinition>(name, docString, baseContracts, structs, - stateVariables, functions, modifiers); + stateVariables, functions, modifiers, events); } ASTPointer<InheritanceSpecifier> Parser::parseInheritanceSpecifier() @@ -240,8 +245,7 @@ ASTPointer<StructDefinition> Parser::parseStructDefinition() expectToken(Token::LBRACE); while (m_scanner->getCurrentToken() != Token::RBRACE) { - bool const allowVar = false; - members.push_back(parseVariableDeclaration(allowVar)); + members.push_back(parseVariableDeclaration()); expectToken(Token::SEMICOLON); } nodeFactory.markEndPosition(); @@ -249,12 +253,20 @@ ASTPointer<StructDefinition> Parser::parseStructDefinition() return nodeFactory.createNode<StructDefinition>(name, members); } -ASTPointer<VariableDeclaration> Parser::parseVariableDeclaration(bool _allowVar, bool _isPublic, bool _isStateVariable) +ASTPointer<VariableDeclaration> Parser::parseVariableDeclaration(VarDeclParserOptions const& _options) { ASTNodeFactory nodeFactory(*this); - ASTPointer<TypeName> type = parseTypeName(_allowVar); + ASTPointer<TypeName> type = parseTypeName(_options.allowVar); + bool isIndexed = false; + if (_options.allowIndexed && m_scanner->getCurrentToken() == Token::INDEXED) + { + isIndexed = true; + m_scanner->next(); + } nodeFactory.markEndPosition(); - return nodeFactory.createNode<VariableDeclaration>(type, expectIdentifierToken(), _isPublic, _isStateVariable); + return nodeFactory.createNode<VariableDeclaration>(type, expectIdentifierToken(), + _options.isPublic, _options.isStateVariable, + isIndexed); } ASTPointer<ModifierDefinition> Parser::parseModifierDefinition() @@ -284,6 +296,23 @@ ASTPointer<ModifierDefinition> Parser::parseModifierDefinition() return nodeFactory.createNode<ModifierDefinition>(name, docstring, parameters, block); } +ASTPointer<EventDefinition> Parser::parseEventDefinition() +{ + ASTNodeFactory nodeFactory(*this); + ASTPointer<ASTString> docstring; + if (m_scanner->getCurrentCommentLiteral() != "") + docstring = make_shared<ASTString>(m_scanner->getCurrentCommentLiteral()); + + expectToken(Token::EVENT); + ASTPointer<ASTString> name(expectIdentifierToken()); + ASTPointer<ParameterList> parameters; + if (m_scanner->getCurrentToken() == Token::LPAREN) + parameters = parseParameterList(true, true); + nodeFactory.markEndPosition(); + expectToken(Token::SEMICOLON); + return nodeFactory.createNode<EventDefinition>(name, docstring, parameters); +} + ASTPointer<ModifierInvocation> Parser::parseModifierInvocation() { ASTNodeFactory nodeFactory(*this); @@ -356,19 +385,20 @@ ASTPointer<Mapping> Parser::parseMapping() return nodeFactory.createNode<Mapping>(keyType, valueType); } -ASTPointer<ParameterList> Parser::parseParameterList(bool _allowEmpty) +ASTPointer<ParameterList> Parser::parseParameterList(bool _allowEmpty, bool _allowIndexed) { ASTNodeFactory nodeFactory(*this); vector<ASTPointer<VariableDeclaration>> parameters; + VarDeclParserOptions options; + options.allowIndexed = _allowIndexed; expectToken(Token::LPAREN); if (!_allowEmpty || m_scanner->getCurrentToken() != Token::RPAREN) { - bool const allowVar = false; - parameters.push_back(parseVariableDeclaration(allowVar)); + parameters.push_back(parseVariableDeclaration(options)); while (m_scanner->getCurrentToken() != Token::RPAREN) { expectToken(Token::COMMA); - parameters.push_back(parseVariableDeclaration(allowVar)); + parameters.push_back(parseVariableDeclaration(options)); } } nodeFactory.markEndPosition(); @@ -510,8 +540,9 @@ ASTPointer<Statement> Parser::parseVarDefOrExprStmt() ASTPointer<VariableDefinition> Parser::parseVariableDefinition() { ASTNodeFactory nodeFactory(*this); - bool const allowVar = true; - ASTPointer<VariableDeclaration> variable = parseVariableDeclaration(allowVar); + VarDeclParserOptions options; + options.allowVar = true; + ASTPointer<VariableDeclaration> variable = parseVariableDeclaration(options); ASTPointer<Expression> value; if (m_scanner->getCurrentToken() == Token::ASSIGN) { |