diff --git a/AST.cpp b/AST.cpp index 71af3286f..52c58170d 100644 --- a/AST.cpp +++ b/AST.cpp @@ -60,6 +60,7 @@ void ContractDefinition::checkTypeRequirements() FunctionDefinition const* fallbackFunction = nullptr; for (ASTPointer const& function: getDefinedFunctions()) + { if (function->getName().empty()) { if (fallbackFunction) @@ -71,6 +72,9 @@ void ContractDefinition::checkTypeRequirements() BOOST_THROW_EXCEPTION(fallbackFunction->getParameterList().createTypeError("Fallback function cannot take parameters.")); } } + if (!function->isFullyImplemented()) + setFullyImplemented(false); + } for (ASTPointer const& modifier: getFunctionModifiers()) modifier->checkTypeRequirements(); diff --git a/AST.h b/AST.h index fa0172b10..c1da90cdb 100644 --- a/AST.h +++ b/AST.h @@ -206,6 +206,7 @@ public: /// @return whether this node is fully implemented or not bool isFullyImplemented() const { return m_implemented; } + void setFullyImplemented(bool _implemented) { m_implemented = _implemented; } protected: bool m_implemented; @@ -231,12 +232,11 @@ public: std::vector> const& _stateVariables, std::vector> const& _definedFunctions, std::vector> const& _functionModifiers, - std::vector> const& _events, - bool _isFullyImplemented + std::vector> const& _events ): Declaration(_location, _name), Documented(_documentation), - ImplementationOptional(_isFullyImplemented), + ImplementationOptional(true), m_baseContracts(_baseContracts), m_definedStructs(_definedStructs), m_definedEnums(_definedEnums), @@ -244,7 +244,7 @@ public: m_definedFunctions(_definedFunctions), m_functionModifiers(_functionModifiers), m_events(_events) - {} + {} virtual void accept(ASTVisitor& _visitor) override; virtual void accept(ASTConstVisitor& _visitor) const override; @@ -421,7 +421,7 @@ public: m_functionModifiers(_modifiers), m_returnParameters(_returnParameters), m_body(_body) - {} + {} virtual void accept(ASTVisitor& _visitor) override; virtual void accept(ASTConstVisitor& _visitor) const override; diff --git a/Parser.cpp b/Parser.cpp index 3dfedf6d2..0f1b34069 100644 --- a/Parser.cpp +++ b/Parser.cpp @@ -116,7 +116,6 @@ ASTPointer Parser::parseContractDefinition() { ASTNodeFactory nodeFactory(*this); ASTPointer docString; - bool contractFullyImplemented = true; if (m_scanner->getCurrentCommentLiteral() != "") docString = make_shared(m_scanner->getCurrentCommentLiteral()); expectToken(Token::Contract); @@ -145,8 +144,6 @@ ASTPointer Parser::parseContractDefinition() { ASTPointer func = parseFunctionDefinition(name.get()); functions.push_back(func); - if (!func->isFullyImplemented()) - contractFullyImplemented = false; } else if (currentToken == Token::Struct) structs.push_back(parseStructDefinition()); @@ -179,8 +176,7 @@ ASTPointer Parser::parseContractDefinition() stateVariables, functions, modifiers, - events, - contractFullyImplemented + events ); }