@@ -412,24 +412,43 @@ void ConstantEvaluator::endVisit(TupleExpression const& _tuple)
412412
413413void 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