Skip to content

Commit 9b5fd83

Browse files
fixup! nested member access
1 parent 64eca49 commit 9b5fd83

File tree

1 file changed

+28
-9
lines changed

1 file changed

+28
-9
lines changed

libsolidity/analysis/ConstantEvaluator.cpp

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -412,24 +412,43 @@ void ConstantEvaluator::endVisit(TupleExpression const& _tuple)
412412

413413
void ConstantEvaluator::endVisit(MemberAccess const& _memberAccess)
414414
{
415-
if (auto const* parentIdentifier = dynamic_cast<Identifier const*>(&_memberAccess.expression()))
415+
std::vector<VariableDeclaration const*> candidateVariables;
416+
if (auto const* nestedMemberAccess = dynamic_cast<MemberAccess const*>(&_memberAccess.expression()))
417+
{
418+
// The nested expression can only be accessing a contract inside an imported module
419+
auto const* moduleIdentifier = dynamic_cast<Identifier const*>(&nestedMemberAccess->expression());
420+
solAssert(moduleIdentifier);
421+
auto const* importedModule = dynamic_cast<ImportDirective const*>(moduleIdentifier->annotation().referencedDeclaration);
422+
solAssert(importedModule);
423+
SourceUnit const* sourceUnit = importedModule->annotation().sourceUnit;
424+
solAssert(sourceUnit);
425+
426+
auto contracts = ASTNode::filteredNodes<ContractDefinition>(sourceUnit->nodes());
427+
auto contract = ranges::find_if(
428+
contracts,
429+
[&](ContractDefinition const* _contract) { return _contract->name() == nestedMemberAccess->memberName(); }
430+
);
431+
if (contract != ranges::end(contracts))
432+
candidateVariables = (*contract)->stateVariables();
433+
434+
}
435+
else if (auto const* parentIdentifier = dynamic_cast<Identifier const*>(&_memberAccess.expression()))
416436
{
417437
Declaration const* referencedDeclaration = parentIdentifier->annotation().referencedDeclaration;
418-
std::vector<VariableDeclaration const*> candidateVariables;
419438
if (auto const* contract = dynamic_cast<ContractDefinition const*>(referencedDeclaration))
420439
candidateVariables = contract->stateVariables();
421440
else if (auto const* import = dynamic_cast<ImportDirective const*>(referencedDeclaration))
422441
{
423442
if (SourceUnit const* sourceUnit = import->annotation().sourceUnit)
424443
candidateVariables = ASTNode::filteredNodes<VariableDeclaration>(sourceUnit->nodes());
425444
}
445+
}
426446

427-
auto variable = ranges::find_if(
428-
candidateVariables,
429-
[&](VariableDeclaration const* _variable) { return _variable->name() == _memberAccess.memberName(); }
430-
);
447+
auto variable = ranges::find_if(
448+
candidateVariables,
449+
[&](VariableDeclaration const* _variable) { return _variable->name() == _memberAccess.memberName(); }
450+
);
431451

432-
if (variable != ranges::end(candidateVariables) && (*variable)->isConstant())
433-
m_values[&_memberAccess] = evaluate(**variable);
434-
}
452+
if (variable != ranges::end(candidateVariables) && (*variable)->isConstant())
453+
m_values[&_memberAccess] = evaluate(**variable);
435454
}

0 commit comments

Comments
 (0)