aboutsummaryrefslogtreecommitdiffstats
path: root/Parser.cpp
diff options
context:
space:
mode:
authorChristian <c@ethdev.com>2015-02-03 00:24:09 +0800
committerChristian <c@ethdev.com>2015-02-03 00:24:09 +0800
commite157364fe8d52d36dd5b6bbf15355da33fcbcc19 (patch)
tree70bcbe71f2738bd6e41541fb8d7920f6c09c9717 /Parser.cpp
parentadce36ff583389819638218e2a11c0887b35282c (diff)
downloaddexon-solidity-e157364fe8d52d36dd5b6bbf15355da33fcbcc19.tar
dexon-solidity-e157364fe8d52d36dd5b6bbf15355da33fcbcc19.tar.gz
dexon-solidity-e157364fe8d52d36dd5b6bbf15355da33fcbcc19.tar.bz2
dexon-solidity-e157364fe8d52d36dd5b6bbf15355da33fcbcc19.tar.lz
dexon-solidity-e157364fe8d52d36dd5b6bbf15355da33fcbcc19.tar.xz
dexon-solidity-e157364fe8d52d36dd5b6bbf15355da33fcbcc19.tar.zst
dexon-solidity-e157364fe8d52d36dd5b6bbf15355da33fcbcc19.zip
Visibility specifiers.
Diffstat (limited to 'Parser.cpp')
-rw-r--r--Parser.cpp49
1 files changed, 34 insertions, 15 deletions
diff --git a/Parser.cpp b/Parser.cpp
index d2e888a8..cc75fc0a 100644
--- a/Parser.cpp
+++ b/Parser.cpp
@@ -131,27 +131,19 @@ ASTPointer<ContractDefinition> Parser::parseContractDefinition()
}
while (m_scanner->getCurrentToken() == Token::COMMA);
expectToken(Token::LBRACE);
- bool visibilityIsPublic = true;
while (true)
{
Token::Value currentToken = m_scanner->getCurrentToken();
if (currentToken == Token::RBRACE)
break;
- else if (currentToken == Token::PUBLIC || currentToken == Token::PRIVATE)
- {
- visibilityIsPublic = (m_scanner->getCurrentToken() == Token::PUBLIC);
- m_scanner->next();
- expectToken(Token::COLON);
- }
else if (currentToken == Token::FUNCTION)
- functions.push_back(parseFunctionDefinition(visibilityIsPublic, name.get()));
+ functions.push_back(parseFunctionDefinition(name.get()));
else if (currentToken == Token::STRUCT)
structs.push_back(parseStructDefinition());
else if (currentToken == Token::IDENTIFIER || currentToken == Token::MAPPING ||
Token::isElementaryTypeName(currentToken))
{
VarDeclParserOptions options;
- options.isPublic = visibilityIsPublic;
options.isStateVariable = true;
stateVariables.push_back(parseVariableDeclaration(options));
expectToken(Token::SEMICOLON);
@@ -186,7 +178,22 @@ ASTPointer<InheritanceSpecifier> Parser::parseInheritanceSpecifier()
return nodeFactory.createNode<InheritanceSpecifier>(name, arguments);
}
-ASTPointer<FunctionDefinition> Parser::parseFunctionDefinition(bool _isPublic, ASTString const* _contractName)
+Declaration::Visibility Parser::parseVisibilitySpecifier(Token::Value _token)
+{
+ Declaration::Visibility visibility;
+ if (_token == Token::PUBLIC)
+ visibility = Declaration::Visibility::PUBLIC;
+ else if (_token == Token::PROTECTED)
+ visibility = Declaration::Visibility::PROTECTED;
+ else if (_token == Token::PRIVATE)
+ visibility = Declaration::Visibility::PRIVATE;
+ else
+ solAssert(false, "Invalid visibility specifier.");
+ m_scanner->next();
+ return visibility;
+}
+
+ASTPointer<FunctionDefinition> Parser::parseFunctionDefinition(ASTString const* _contractName)
{
ASTNodeFactory nodeFactory(*this);
ASTPointer<ASTString> docstring;
@@ -201,16 +208,24 @@ ASTPointer<FunctionDefinition> Parser::parseFunctionDefinition(bool _isPublic, A
name = expectIdentifierToken();
ASTPointer<ParameterList> parameters(parseParameterList());
bool isDeclaredConst = false;
+ Declaration::Visibility visibility(Declaration::Visibility::DEFAULT);
vector<ASTPointer<ModifierInvocation>> modifiers;
while (true)
{
- if (m_scanner->getCurrentToken() == Token::CONST)
+ Token::Value token = m_scanner->getCurrentToken();
+ if (token == Token::CONST)
{
isDeclaredConst = true;
m_scanner->next();
}
- else if (m_scanner->getCurrentToken() == Token::IDENTIFIER)
+ else if (token == Token::IDENTIFIER)
modifiers.push_back(parseModifierInvocation());
+ else if (Token::isVisibilitySpecifier(token))
+ {
+ if (visibility != Declaration::Visibility::DEFAULT)
+ BOOST_THROW_EXCEPTION(createParserError("Multiple visibility specifiers."));
+ visibility = parseVisibilitySpecifier(token);
+ }
else
break;
}
@@ -226,7 +241,7 @@ ASTPointer<FunctionDefinition> Parser::parseFunctionDefinition(bool _isPublic, A
ASTPointer<Block> block = parseBlock();
nodeFactory.setEndPositionFromNode(block);
bool const c_isConstructor = (_contractName && *name == *_contractName);
- return nodeFactory.createNode<FunctionDefinition>(name, _isPublic, c_isConstructor, docstring,
+ return nodeFactory.createNode<FunctionDefinition>(name, visibility, c_isConstructor, docstring,
parameters, isDeclaredConst, modifiers,
returnParameters, block);
}
@@ -253,14 +268,18 @@ ASTPointer<VariableDeclaration> Parser::parseVariableDeclaration(VarDeclParserOp
ASTNodeFactory nodeFactory(*this);
ASTPointer<TypeName> type = parseTypeName(_options.allowVar);
bool isIndexed = false;
- if (_options.allowIndexed && m_scanner->getCurrentToken() == Token::INDEXED)
+ Token::Value token = m_scanner->getCurrentToken();
+ if (_options.allowIndexed && token == Token::INDEXED)
{
isIndexed = true;
m_scanner->next();
}
+ Declaration::Visibility visibility(Declaration::Visibility::DEFAULT);
+ if (_options.isStateVariable && Token::isVisibilitySpecifier(token))
+ visibility = parseVisibilitySpecifier(token);
nodeFactory.markEndPosition();
return nodeFactory.createNode<VariableDeclaration>(type, expectIdentifierToken(),
- _options.isPublic, _options.isStateVariable,
+ visibility, _options.isStateVariable,
isIndexed);
}