Skip to content

Commit 394888c

Browse files
Support member access
1 parent 73b9da3 commit 394888c

File tree

5 files changed

+49
-0
lines changed

5 files changed

+49
-0
lines changed

Changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
Language Features:
44

55
Compiler Features:
6+
* Constant Evaluator: Support for constants referenced by member access expressions.
67
* ethdebug: Experimental support for instructions and source locations under EOF.
78

89
Bugfixes:

libsolidity/analysis/ConstantEvaluator.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,3 +407,15 @@ void ConstantEvaluator::endVisit(TupleExpression const& _tuple)
407407
if (!_tuple.isInlineArray() && _tuple.components().size() == 1)
408408
m_values[&_tuple] = evaluate(*_tuple.components().front());
409409
}
410+
411+
void ConstantEvaluator::endVisit(MemberAccess const& _memberAccess)
412+
{
413+
auto const* referencedDeclaration = _memberAccess.annotation().referencedDeclaration;
414+
if (!referencedDeclaration)
415+
return;
416+
if (
417+
auto const* variable = dynamic_cast<VariableDeclaration const*>(referencedDeclaration);
418+
variable && variable->isConstant()
419+
)
420+
m_values[&_memberAccess] = evaluate(*variable);
421+
}

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.

libsolidity/analysis/ReferencesResolver.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
#include <boost/algorithm/string.hpp>
4040
#include <boost/algorithm/string/split.hpp>
4141

42+
#include <range/v3/algorithm/find_if.hpp>
43+
4244
using namespace solidity;
4345
using namespace solidity::langutil;
4446
using namespace solidity::frontend;
@@ -504,3 +506,35 @@ void ReferencesResolver::validateYulIdentifierName(yul::YulName _name, SourceLoc
504506
"The identifier name \"" + _name.str() + "\" is reserved."
505507
);
506508
}
509+
510+
void ReferencesResolver::endVisit(MemberAccess const& _memberAccess)
511+
{
512+
// This is only for specific cases to support ConstantEvaluator.
513+
std::vector<Declaration const*> candidates;
514+
if (auto const* identifier = dynamic_cast<Identifier const*>(&_memberAccess.expression()))
515+
{
516+
if (auto const* contract = dynamic_cast<ContractDefinition const*>(identifier->annotation().referencedDeclaration))
517+
candidates += contract->stateVariables();
518+
else if (auto const* importedModule = dynamic_cast<ImportDirective const*>(identifier->annotation().referencedDeclaration))
519+
{
520+
SourceUnit const* sourceUnit = importedModule->annotation().sourceUnit;
521+
solAssert(sourceUnit);
522+
candidates += ASTNode::filteredNodes<VariableDeclaration>(sourceUnit->nodes());
523+
candidates += ASTNode::filteredNodes<ContractDefinition>(sourceUnit->nodes());
524+
}
525+
}
526+
else if (auto const* nestedMemberAccess = dynamic_cast<MemberAccess const*>(&_memberAccess.expression()))
527+
{
528+
auto const* contract = dynamic_cast<ContractDefinition const*>(nestedMemberAccess->annotation().referencedDeclaration);
529+
if (!contract)
530+
return;
531+
candidates += contract->stateVariables();
532+
}
533+
534+
auto declaration = ranges::find_if(
535+
candidates,
536+
[&](Declaration const* _declaration) { return _declaration->name() == _memberAccess.memberName(); }
537+
);
538+
if (declaration != ranges::end(candidates))
539+
_memberAccess.annotation().referencedDeclaration = *declaration;
540+
}

libsolidity/analysis/ReferencesResolver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ class ReferencesResolver: private ASTConstVisitor, private yul::ASTWalker
8686
bool visit(Return const& _return) override;
8787
bool visit(UsingForDirective const& _usingFor) override;
8888
bool visit(BinaryOperation const& _binaryOperation) override;
89+
void endVisit(MemberAccess const& _memberAccess) override;
8990

9091
void operator()(yul::FunctionDefinition const& _function) override;
9192
void operator()(yul::Identifier const& _identifier) override;

0 commit comments

Comments
 (0)