Update ViewPureChecker

This commit is contained in:
wechman 2022-07-12 12:00:23 +02:00
parent c274d07a73
commit 275a43068c
2 changed files with 27 additions and 6 deletions

View File

@ -323,18 +323,35 @@ ViewPureChecker::MutabilityAndLocation const& ViewPureChecker::modifierMutabilit
return m_inferredMutability.at(&_modifier);
}
// TODO needs to visit binaryoperation as well
void ViewPureChecker::reportFunctionCallMutability(StateMutability _mutability, langutil::SourceLocation const& _location)
{
// We only require "nonpayable" to call a payable function.
if (_mutability == StateMutability::Payable)
_mutability = StateMutability::NonPayable;
reportMutability(_mutability, _location);
}
void ViewPureChecker::endVisit(BinaryOperation const& _binaryOperation)
{
if (_binaryOperation.annotation().userDefinedFunction)
reportFunctionCallMutability(_binaryOperation.annotation().userDefinedFunction->stateMutability(), _binaryOperation.location());
}
void ViewPureChecker::endVisit(UnaryOperation const& _unaryOperation)
{
if (_unaryOperation.annotation().userDefinedFunction)
reportFunctionCallMutability(_unaryOperation.annotation().userDefinedFunction->stateMutability(), _unaryOperation.location());
}
void ViewPureChecker::endVisit(FunctionCall const& _functionCall)
{
if (*_functionCall.annotation().kind != FunctionCallKind::FunctionCall)
return;
StateMutability mutability = dynamic_cast<FunctionType const&>(*_functionCall.expression().annotation().type).stateMutability();
// We only require "nonpayable" to call a payble function.
if (mutability == StateMutability::Payable)
mutability = StateMutability::NonPayable;
reportMutability(mutability, _functionCall.location());
reportFunctionCallMutability(
dynamic_cast<FunctionType const&>(*_functionCall.expression().annotation().type).stateMutability(),
_functionCall.location()
);
}
bool ViewPureChecker::visit(MemberAccess const& _memberAccess)

View File

@ -54,6 +54,8 @@ private:
bool visit(FunctionDefinition const& _funDef) override;
void endVisit(FunctionDefinition const& _funDef) override;
void endVisit(BinaryOperation const& _binaryOperation) override;
void endVisit(UnaryOperation const& _unaryOperation) override;
bool visit(ModifierDefinition const& _modifierDef) override;
void endVisit(ModifierDefinition const& _modifierDef) override;
void endVisit(Identifier const& _identifier) override;
@ -73,6 +75,8 @@ private:
std::optional<langutil::SourceLocation> const& _nestedLocation = {}
);
void reportFunctionCallMutability(StateMutability _mutability, langutil::SourceLocation const& _location);
/// Determines the mutability of modifier if not already cached.
MutabilityAndLocation const& modifierMutability(ModifierDefinition const& _modifier);