aboutsummaryrefslogtreecommitdiffstats
path: root/Parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Parser.cpp')
-rw-r--r--Parser.cpp33
1 files changed, 28 insertions, 5 deletions
diff --git a/Parser.cpp b/Parser.cpp
index 393d2734..3dfedf6d 100644
--- a/Parser.cpp
+++ b/Parser.cpp
@@ -116,6 +116,7 @@ ASTPointer<ContractDefinition> Parser::parseContractDefinition()
{
ASTNodeFactory nodeFactory(*this);
ASTPointer<ASTString> docString;
+ bool contractFullyImplemented = true;
if (m_scanner->getCurrentCommentLiteral() != "")
docString = make_shared<ASTString>(m_scanner->getCurrentCommentLiteral());
expectToken(Token::Contract);
@@ -141,7 +142,12 @@ ASTPointer<ContractDefinition> Parser::parseContractDefinition()
if (currentToken == Token::RBrace)
break;
else if (currentToken == Token::Function)
- functions.push_back(parseFunctionDefinition(name.get()));
+ {
+ ASTPointer<FunctionDefinition> func = parseFunctionDefinition(name.get());
+ functions.push_back(func);
+ if (!func->isFullyImplemented())
+ contractFullyImplemented = false;
+ }
else if (currentToken == Token::Struct)
structs.push_back(parseStructDefinition());
else if (currentToken == Token::Enum)
@@ -164,8 +170,18 @@ ASTPointer<ContractDefinition> Parser::parseContractDefinition()
}
nodeFactory.markEndPosition();
expectToken(Token::RBrace);
- return nodeFactory.createNode<ContractDefinition>(name, docString, baseContracts, structs, enums,
- stateVariables, functions, modifiers, events);
+ return nodeFactory.createNode<ContractDefinition>(
+ name,
+ docString,
+ baseContracts,
+ structs,
+ enums,
+ stateVariables,
+ functions,
+ modifiers,
+ events,
+ contractFullyImplemented
+ );
}
ASTPointer<InheritanceSpecifier> Parser::parseInheritanceSpecifier()
@@ -247,8 +263,15 @@ ASTPointer<FunctionDefinition> Parser::parseFunctionDefinition(ASTString const*
}
else
returnParameters = createEmptyParameterList();
- ASTPointer<Block> block = parseBlock();
- nodeFactory.setEndPositionFromNode(block);
+ ASTPointer<Block> block = ASTPointer<Block>();
+ nodeFactory.markEndPosition();
+ if (m_scanner->getCurrentToken() != Token::Semicolon)
+ {
+ block = parseBlock();
+ nodeFactory.setEndPositionFromNode(block);
+ }
+ else
+ m_scanner->next(); // just consume the ';'
bool const c_isConstructor = (_contractName && *name == *_contractName);
return nodeFactory.createNode<FunctionDefinition>(name, visibility, c_isConstructor, docstring,
parameters, isDeclaredConst, modifiers,