| 33 | using namespace solidity::frontend; |
| 34 | |
| 35 | Declaration const* DeclarationContainer::conflictingDeclaration( |
| 36 | Declaration const& _declaration, |
| 37 | ASTString const* _name |
| 38 | ) const |
| 39 | { |
| 40 | if (!_name) |
| 41 | _name = &_declaration.name(); |
| 42 | solAssert(!_name->empty(), ""); |
| 43 | std::vector<Declaration const*> declarations; |
| 44 | if (m_declarations.count(*_name)) |
| 45 | declarations += m_declarations.at(*_name); |
| 46 | if (m_invisibleDeclarations.count(*_name)) |
| 47 | declarations += m_invisibleDeclarations.at(*_name); |
| 48 | |
| 49 | if ( |
| 50 | dynamic_cast<FunctionDefinition const*>(&_declaration) || |
| 51 | dynamic_cast<EventDefinition const*>(&_declaration) || |
| 52 | dynamic_cast<MagicVariableDeclaration const*>(&_declaration) |
| 53 | ) |
| 54 | { |
| 55 | // check that all other declarations are of the same kind (in which |
| 56 | // case the type checker will ensure that the signatures are different) |
| 57 | for (Declaration const* declaration: declarations) |
| 58 | { |
| 59 | if ( |
| 60 | dynamic_cast<FunctionDefinition const*>(&_declaration) && |
| 61 | !dynamic_cast<FunctionDefinition const*>(declaration) |
| 62 | ) |
| 63 | return declaration; |
| 64 | if ( |
| 65 | dynamic_cast<EventDefinition const*>(&_declaration) && |
| 66 | !dynamic_cast<EventDefinition const*>(declaration) |
| 67 | ) |
| 68 | return declaration; |
| 69 | if ( |
| 70 | dynamic_cast<MagicVariableDeclaration const*>(&_declaration) && |
| 71 | !dynamic_cast<MagicVariableDeclaration const*>(declaration) |
| 72 | ) |
| 73 | return declaration; |
| 74 | // Or, continue. |
| 75 | } |
| 76 | } |
| 77 | else if (declarations.size() == 1 && declarations.front() == &_declaration) |
| 78 | return nullptr; |
| 79 | else if (!declarations.empty()) |
| 80 | return declarations.front(); |
| 81 | |
| 82 | return nullptr; |
| 83 | } |
| 84 | |
| 85 | void DeclarationContainer::activateVariable(ASTString const& _name) |
| 86 | { |
no test coverage detected