aboutsummaryrefslogtreecommitdiffstats
path: root/Parser.cpp
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2015-02-21 21:53:45 +0800
committerchriseth <c@ethdev.com>2015-02-21 21:53:45 +0800
commit75498a48d83277240605b43e27197be36c02ce23 (patch)
treeb7eedbc3a2ca015d7465b8f2037272d62897149f /Parser.cpp
parent89d84edb16812ff9e4b1049ee0257d65c75f5a3c (diff)
parentfa3cd1cdc2b9e328e46508de6cd4b0fdaab62f84 (diff)
downloaddexon-solidity-75498a48d83277240605b43e27197be36c02ce23.tar
dexon-solidity-75498a48d83277240605b43e27197be36c02ce23.tar.gz
dexon-solidity-75498a48d83277240605b43e27197be36c02ce23.tar.bz2
dexon-solidity-75498a48d83277240605b43e27197be36c02ce23.tar.lz
dexon-solidity-75498a48d83277240605b43e27197be36c02ce23.tar.xz
dexon-solidity-75498a48d83277240605b43e27197be36c02ce23.tar.zst
dexon-solidity-75498a48d83277240605b43e27197be36c02ce23.zip
Merge pull request #1093 from LianaHus/sol_InlineMemberInits
Inline member inits
Diffstat (limited to 'Parser.cpp')
-rw-r--r--Parser.cpp47
1 files changed, 25 insertions, 22 deletions
diff --git a/Parser.cpp b/Parser.cpp
index 72334c6c..9940fb8d 100644
--- a/Parser.cpp
+++ b/Parser.cpp
@@ -148,6 +148,7 @@ ASTPointer<ContractDefinition> Parser::parseContractDefinition()
{
VarDeclParserOptions options;
options.isStateVariable = true;
+ options.allowInitialValue = true;
stateVariables.push_back(parseVariableDeclaration(options));
expectToken(Token::Semicolon);
}
@@ -324,9 +325,19 @@ ASTPointer<VariableDeclaration> Parser::parseVariableDeclaration(VarDeclParserOp
}
else
identifier = expectIdentifierToken();
- return nodeFactory.createNode<VariableDeclaration>(type, identifier,
- visibility, _options.isStateVariable,
- isIndexed);
+ ASTPointer<Expression> value;
+ if (_options.allowInitialValue)
+ {
+ if (m_scanner->getCurrentToken() == Token::Assign)
+ {
+ m_scanner->next();
+ value = parseExpression();
+ nodeFactory.setEndPositionFromNode(value);
+ }
+ }
+ return nodeFactory.createNode<VariableDeclaration>(type, identifier, value,
+ visibility, _options.isStateVariable,
+ isIndexed);
}
ASTPointer<ModifierDefinition> Parser::parseModifierDefinition()
@@ -519,7 +530,7 @@ ASTPointer<Statement> Parser::parseStatement()
}
// fall-through
default:
- statement = parseVarDefOrExprStmt();
+ statement = parseVarDeclOrExprStmt();
}
expectToken(Token::Semicolon);
return statement;
@@ -568,7 +579,7 @@ ASTPointer<ForStatement> Parser::parseForStatement()
// LTODO: Maybe here have some predicate like peekExpression() instead of checking for semicolon and RParen?
if (m_scanner->getCurrentToken() != Token::Semicolon)
- initExpression = parseVarDefOrExprStmt();
+ initExpression = parseVarDeclOrExprStmt();
expectToken(Token::Semicolon);
if (m_scanner->getCurrentToken() != Token::Semicolon)
@@ -587,30 +598,22 @@ ASTPointer<ForStatement> Parser::parseForStatement()
body);
}
-ASTPointer<Statement> Parser::parseVarDefOrExprStmt()
+ASTPointer<Statement> Parser::parseVarDeclOrExprStmt()
{
- if (peekVariableDefinition())
- return parseVariableDefinition();
+ if (peekVariableDeclarationStatement())
+ return parseVariableDeclarationStatement();
else
return parseExpressionStatement();
}
-ASTPointer<VariableDefinition> Parser::parseVariableDefinition()
+ASTPointer<VariableDeclarationStatement> Parser::parseVariableDeclarationStatement()
{
ASTNodeFactory nodeFactory(*this);
VarDeclParserOptions options;
options.allowVar = true;
+ options.allowInitialValue = true;
ASTPointer<VariableDeclaration> variable = parseVariableDeclaration(options);
- ASTPointer<Expression> value;
- if (m_scanner->getCurrentToken() == Token::Assign)
- {
- m_scanner->next();
- value = parseExpression();
- nodeFactory.setEndPositionFromNode(value);
- }
- else
- nodeFactory.setEndPositionFromNode(variable);
- return nodeFactory.createNode<VariableDefinition>(variable, value);
+ return nodeFactory.createNode<VariableDeclarationStatement>(variable);
}
ASTPointer<ExpressionStatement> Parser::parseExpressionStatement()
@@ -822,11 +825,11 @@ pair<vector<ASTPointer<Expression>>, vector<ASTPointer<ASTString>>> Parser::pars
}
-bool Parser::peekVariableDefinition()
+bool Parser::peekVariableDeclarationStatement()
{
- // distinguish between variable definition (and potentially assignment) and expression statement
+ // distinguish between variable declaration (and potentially assignment) and expression statement
// (which include assignments to other expressions and pre-declared variables)
- // We have a variable definition if we get a keyword that specifies a type name, or
+ // We have a variable declaration if we get a keyword that specifies a type name, or
// in the case of a user-defined type, we have two identifiers following each other.
return (m_scanner->getCurrentToken() == Token::Mapping ||
m_scanner->getCurrentToken() == Token::Var ||