Parse override keyword for modifier definitions

This commit is contained in:
Mathias Baumann 2019-09-16 12:32:14 +02:00
parent f4c40080c4
commit b76106fc4a
4 changed files with 20 additions and 7 deletions

View File

@ -596,21 +596,25 @@ public:
ASTPointer<ASTString> const& _name, ASTPointer<ASTString> const& _name,
Declaration::Visibility _visibility, Declaration::Visibility _visibility,
ASTPointer<ParameterList> const& _parameters, ASTPointer<ParameterList> const& _parameters,
ASTPointer<OverrideSpecifier> const& _overrides = nullptr,
ASTPointer<ParameterList> const& _returnParameters = ASTPointer<ParameterList>() ASTPointer<ParameterList> const& _returnParameters = ASTPointer<ParameterList>()
): ):
Declaration(_location, _name, _visibility), Declaration(_location, _name, _visibility),
m_parameters(_parameters), m_parameters(_parameters),
m_overrides(_overrides),
m_returnParameters(_returnParameters) m_returnParameters(_returnParameters)
{ {
} }
std::vector<ASTPointer<VariableDeclaration>> const& parameters() const { return m_parameters->parameters(); } std::vector<ASTPointer<VariableDeclaration>> const& parameters() const { return m_parameters->parameters(); }
ASTPointer<OverrideSpecifier> const& overrides() const { return m_overrides; }
std::vector<ASTPointer<VariableDeclaration>> const& returnParameters() const { return m_returnParameters->parameters(); } std::vector<ASTPointer<VariableDeclaration>> const& returnParameters() const { return m_returnParameters->parameters(); }
ParameterList const& parameterList() const { return *m_parameters; } ParameterList const& parameterList() const { return *m_parameters; }
ASTPointer<ParameterList> const& returnParameterList() const { return m_returnParameters; } ASTPointer<ParameterList> const& returnParameterList() const { return m_returnParameters; }
protected: protected:
ASTPointer<ParameterList> m_parameters; ASTPointer<ParameterList> m_parameters;
ASTPointer<OverrideSpecifier> m_overrides;
ASTPointer<ParameterList> m_returnParameters; ASTPointer<ParameterList> m_returnParameters;
}; };
@ -656,12 +660,11 @@ public:
ASTPointer<ParameterList> const& _returnParameters, ASTPointer<ParameterList> const& _returnParameters,
ASTPointer<Block> const& _body ASTPointer<Block> const& _body
): ):
CallableDeclaration(_location, _name, _visibility, _parameters, _returnParameters), CallableDeclaration(_location, _name, _visibility, _parameters, _overrides, _returnParameters),
Documented(_documentation), Documented(_documentation),
ImplementationOptional(_body != nullptr), ImplementationOptional(_body != nullptr),
m_stateMutability(_stateMutability), m_stateMutability(_stateMutability),
m_isConstructor(_isConstructor), m_isConstructor(_isConstructor),
m_overrides(_overrides),
m_functionModifiers(_modifiers), m_functionModifiers(_modifiers),
m_body(_body) m_body(_body)
{} {}
@ -671,8 +674,8 @@ public:
StateMutability stateMutability() const { return m_stateMutability; } StateMutability stateMutability() const { return m_stateMutability; }
bool isConstructor() const { return m_isConstructor; } bool isConstructor() const { return m_isConstructor; }
ASTPointer<OverrideSpecifier> const& overrides() const { return m_overrides; }
bool isFallback() const { return !m_isConstructor && name().empty(); } bool isFallback() const { return !m_isConstructor && name().empty(); }
bool isOverridable() const { return !isFallback() && !isConstructor(); }
bool isPayable() const { return m_stateMutability == StateMutability::Payable; } bool isPayable() const { return m_stateMutability == StateMutability::Payable; }
std::vector<ASTPointer<ModifierInvocation>> const& modifiers() const { return m_functionModifiers; } std::vector<ASTPointer<ModifierInvocation>> const& modifiers() const { return m_functionModifiers; }
Block const& body() const { solAssert(m_body, ""); return *m_body; } Block const& body() const { solAssert(m_body, ""); return *m_body; }
@ -700,7 +703,6 @@ public:
private: private:
StateMutability m_stateMutability; StateMutability m_stateMutability;
bool m_isConstructor; bool m_isConstructor;
ASTPointer<OverrideSpecifier> m_overrides;
std::vector<ASTPointer<ModifierInvocation>> m_functionModifiers; std::vector<ASTPointer<ModifierInvocation>> m_functionModifiers;
ASTPointer<Block> m_body; ASTPointer<Block> m_body;
}; };
@ -814,9 +816,10 @@ public:
ASTPointer<ASTString> const& _name, ASTPointer<ASTString> const& _name,
ASTPointer<ASTString> const& _documentation, ASTPointer<ASTString> const& _documentation,
ASTPointer<ParameterList> const& _parameters, ASTPointer<ParameterList> const& _parameters,
ASTPointer<OverrideSpecifier> const& _overrides,
ASTPointer<Block> const& _body ASTPointer<Block> const& _body
): ):
CallableDeclaration(_location, _name, Visibility::Internal, _parameters), CallableDeclaration(_location, _name, Visibility::Internal, _parameters, _overrides),
Documented(_documentation), Documented(_documentation),
m_body(_body) m_body(_body)
{ {

View File

@ -262,6 +262,8 @@ void ModifierDefinition::accept(ASTVisitor& _visitor)
if (_visitor.visit(*this)) if (_visitor.visit(*this))
{ {
m_parameters->accept(_visitor); m_parameters->accept(_visitor);
if (m_overrides)
m_overrides->accept(_visitor);
m_body->accept(_visitor); m_body->accept(_visitor);
} }
_visitor.endVisit(*this); _visitor.endVisit(*this);
@ -272,6 +274,8 @@ void ModifierDefinition::accept(ASTConstVisitor& _visitor) const
if (_visitor.visit(*this)) if (_visitor.visit(*this))
{ {
m_parameters->accept(_visitor); m_parameters->accept(_visitor);
if (m_overrides)
m_overrides->accept(_visitor);
m_body->accept(_visitor); m_body->accept(_visitor);
} }
_visitor.endVisit(*this); _visitor.endVisit(*this);

View File

@ -808,9 +808,15 @@ ASTPointer<ModifierDefinition> Parser::parseModifierDefinition()
} }
else else
parameters = createEmptyParameterList(); parameters = createEmptyParameterList();
ASTPointer<OverrideSpecifier> overrides;
if (m_scanner->currentToken() == Token::Override)
overrides = parseOverrideSpecifier();
ASTPointer<Block> block = parseBlock(); ASTPointer<Block> block = parseBlock();
nodeFactory.setEndPositionFromNode(block); nodeFactory.setEndPositionFromNode(block);
return nodeFactory.createNode<ModifierDefinition>(name, docstring, parameters, block); return nodeFactory.createNode<ModifierDefinition>(name, docstring, parameters, overrides, block);
} }
ASTPointer<EventDefinition> Parser::parseEventDefinition() ASTPointer<EventDefinition> Parser::parseEventDefinition()

View File

@ -1,2 +1,2 @@
contract A { modifier mod(uint a) { _; } } contract A { modifier mod(uint a) { _; } }
contract B is A { modifier mod(uint a) { _; } } contract B is A { modifier mod(uint a) override { _; } }