Source units are independent scopes.

This commit is contained in:
chriseth committed 2015-12-09 19:09:24 +01:00
1 parent e510e7e792
commit 7cb7818cea
9 files changed
+204 -55

No files matched your search

+24 -14
View File
@@ -28,15 +28,19 @@ using namespace std;
using namespace dev;
using namespace dev::solidity;
Declaration const* DeclarationContainer::conflictingDeclaration(Declaration const& _declaration) const
Declaration const* DeclarationContainer::conflictingDeclaration(
Declaration const& _declaration,
ASTString const* _name
) const
{
ASTString const& declarationName(_declaration.name());
solAssert(!declarationName.empty(), "");
if (!_name)
_name = &_declaration.name();
solAssert(!_name->empty(), "");
vector<Declaration const*> declarations;
if (m_declarations.count(declarationName))
declarations += m_declarations.at(declarationName);
if (m_invisibleDeclarations.count(declarationName))
declarations += m_invisibleDeclarations.at(declarationName);
if (m_declarations.count(*_name))
declarations += m_declarations.at(*_name);
if (m_invisibleDeclarations.count(*_name))
declarations += m_invisibleDeclarations.at(*_name);
if (dynamic_cast<FunctionDefinition const*>(&_declaration))
{
@@ -51,25 +55,31 @@ Declaration const* DeclarationContainer::conflictingDeclaration(Declaration cons
return nullptr;
}
bool DeclarationContainer::registerDeclaration(Declaration const& _declaration, bool _invisible, bool _update)
bool DeclarationContainer::registerDeclaration(
Declaration const& _declaration,
ASTString const* _name,
bool _invisible,
bool _update
)
{
ASTString const& declarationName(_declaration.name());
if (declarationName.empty())
if (!_name)
_name = &_declaration.name();
if (_name->empty())
return true;
if (_update)
{
solAssert(!dynamic_cast<FunctionDefinition const*>(&_declaration), "Attempt to update function definition.");
m_declarations.erase(declarationName);
m_invisibleDeclarations.erase(declarationName);
m_declarations.erase(*_name);
m_invisibleDeclarations.erase(*_name);
}
else if (conflictingDeclaration(_declaration))
return false;
if (_invisible)
m_invisibleDeclarations[declarationName].push_back(&_declaration);
m_invisibleDeclarations[*_name].push_back(&_declaration);
else
m_declarations[declarationName].push_back(&_declaration);
m_declarations[*_name].push_back(&_declaration);
return true;
}