@@ -412,24 +412,43 @@ void ConstantEvaluator::endVisit(TupleExpression const& _tuple)
412
412
413
413
void ConstantEvaluator::endVisit (MemberAccess const & _memberAccess)
414
414
{
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 ()))
416
436
{
417
437
Declaration const * referencedDeclaration = parentIdentifier->annotation ().referencedDeclaration ;
418
- std::vector<VariableDeclaration const *> candidateVariables;
419
438
if (auto const * contract = dynamic_cast <ContractDefinition const *>(referencedDeclaration))
420
439
candidateVariables = contract->stateVariables ();
421
440
else if (auto const * import = dynamic_cast <ImportDirective const *>(referencedDeclaration))
422
441
{
423
442
if (SourceUnit const * sourceUnit = import ->annotation ().sourceUnit )
424
443
candidateVariables = ASTNode::filteredNodes<VariableDeclaration>(sourceUnit->nodes ());
425
444
}
445
+ }
426
446
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
+ );
431
451
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);
435
454
}
0 commit comments