Skip to content

Commit 78e1d3e

Browse files
Support member access
1 parent e85d021 commit 78e1d3e

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

libsolidity/analysis/ConstantEvaluator.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#include <libsolidity/ast/TypeProvider.h>
2828
#include <liblangutil/ErrorReporter.h>
2929

30+
#include <range/v3/algorithm/find_if.hpp>
31+
3032
#include <limits>
3133

3234
using namespace solidity;
@@ -407,3 +409,24 @@ void ConstantEvaluator::endVisit(TupleExpression const& _tuple)
407409
if (!_tuple.isInlineArray() && _tuple.components().size() == 1)
408410
m_values[&_tuple] = evaluate(*_tuple.components().front());
409411
}
412+
413+
void ConstantEvaluator::endVisit(MemberAccess const& _memberAcess)
414+
{
415+
if (auto const* parentIdentifier = dynamic_cast<Identifier const*>(&_memberAcess.expression()))
416+
{
417+
if (auto const* contract = dynamic_cast<ContractDefinition const*>(parentIdentifier->annotation().referencedDeclaration))
418+
{
419+
auto contractVariables = contract->stateVariables();
420+
auto variable = ranges::find_if(
421+
contractVariables,
422+
[&](VariableDeclaration const* _variable) { return _variable->name() == _memberAcess.memberName(); }
423+
);
424+
425+
if (
426+
variable != ranges::end(contractVariables) &&
427+
(*variable)->isConstant()
428+
)
429+
m_values[&_memberAcess] = evaluate(**variable);
430+
}
431+
}
432+
}

libsolidity/analysis/ConstantEvaluator.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ class ConstantEvaluator: private ASTConstVisitor
7979
void endVisit(Literal const& _literal) override;
8080
void endVisit(Identifier const& _identifier) override;
8181
void endVisit(TupleExpression const& _tuple) override;
82+
void endVisit(MemberAccess const& _memberAcess) override;
8283

8384
langutil::ErrorReporter& m_errorReporter;
8485
/// Current recursion depth.

0 commit comments

Comments
 (0)