VisibleInDerivedContracts() is now virtual()

- Plus an extra test for internal visibility in a base class variable
This commit is contained in:
Lefteris Karapetsas 2015-02-27 10:08:14 +01:00
parent 47177542f5
commit 7db2b6fbdb
3 changed files with 10 additions and 7 deletions

View File

@ -218,22 +218,21 @@ vector<ASTPointer<Declaration>> const& ContractDefinition::getInheritableMembers
for (ContractDefinition const* contract: getLinearizedBaseContracts()) for (ContractDefinition const* contract: getLinearizedBaseContracts())
{ {
for (ASTPointer<FunctionDefinition> const& f: contract->getDefinedFunctions()) for (ASTPointer<FunctionDefinition> const& f: contract->getDefinedFunctions())
if (f->isPublic() && !f->isConstructor() && !f->getName().empty() if (memberSeen.count(f->getName()) == 0 && f->isVisibleInDerivedContracts())
&& memberSeen.count(f->getName()) == 0 && f->isVisibleInDerivedContracts())
{ {
memberSeen.insert(f->getName()); memberSeen.insert(f->getName());
m_inheritableMembers->push_back(f); m_inheritableMembers->push_back(f);
} }
for (ASTPointer<VariableDeclaration> const& v: contract->getStateVariables()) for (ASTPointer<VariableDeclaration> const& v: contract->getStateVariables())
if (v->isPublic() && memberSeen.count(v->getName()) == 0) if (memberSeen.count(v->getName()) == 0 && v->isVisibleInDerivedContracts())
{ {
memberSeen.insert(v->getName()); memberSeen.insert(v->getName());
m_inheritableMembers->push_back(v); m_inheritableMembers->push_back(v);
} }
for (ASTPointer<StructDefinition> const& s: contract->getDefinedStructs()) for (ASTPointer<StructDefinition> const& s: contract->getDefinedStructs())
if (s->isPublic() && memberSeen.count(s->getName()) == 0) if (memberSeen.count(s->getName()) == 0 && s->isVisibleInDerivedContracts())
{ {
memberSeen.insert(s->getName()); memberSeen.insert(s->getName());
m_inheritableMembers->push_back(s); m_inheritableMembers->push_back(s);

7
AST.h
View File

@ -144,7 +144,7 @@ public:
Visibility getVisibility() const { return m_visibility == Visibility::Default ? getDefaultVisibility() : m_visibility; } Visibility getVisibility() const { return m_visibility == Visibility::Default ? getDefaultVisibility() : m_visibility; }
bool isPublic() const { return getVisibility() >= Visibility::Public; } bool isPublic() const { return getVisibility() >= Visibility::Public; }
bool isVisibleInContract() const { return getVisibility() != Visibility::External; } bool isVisibleInContract() const { return getVisibility() != Visibility::External; }
bool isVisibleInDerivedContracts() const { return isVisibleInContract() && getVisibility() >= Visibility::Internal; } virtual bool isVisibleInDerivedContracts() const { return isVisibleInContract() && getVisibility() >= Visibility::Internal; }
/// @returns the scope this declaration resides in. Can be nullptr if it is the global scope. /// @returns the scope this declaration resides in. Can be nullptr if it is the global scope.
/// Available only after name and type resolution step. /// Available only after name and type resolution step.
@ -409,6 +409,11 @@ public:
ASTPointer<ParameterList> const& getReturnParameterList() const { return m_returnParameters; } ASTPointer<ParameterList> const& getReturnParameterList() const { return m_returnParameters; }
Block const& getBody() const { return *m_body; } Block const& getBody() const { return *m_body; }
virtual bool isVisibleInDerivedContracts() const override
{
return !isConstructor() && !getName().empty() && isVisibleInContract() &&
getVisibility() >= Visibility::Internal;
}
virtual TypePointer getType(ContractDefinition const*) const override; virtual TypePointer getType(ContractDefinition const*) const override;
/// Checks that all parameters have allowed types and calls checkTypeRequirements on the body. /// Checks that all parameters have allowed types and calls checkTypeRequirements on the body.

View File

@ -628,8 +628,7 @@ MemberList const& ContractType::getMembers() const
{ {
for (ContractDefinition const* base: m_contract.getLinearizedBaseContracts()) for (ContractDefinition const* base: m_contract.getLinearizedBaseContracts())
for (ASTPointer<FunctionDefinition> const& function: base->getDefinedFunctions()) for (ASTPointer<FunctionDefinition> const& function: base->getDefinedFunctions())
if (!function->isConstructor() && !function->getName().empty()&& if (function->isVisibleInDerivedContracts())
function->isVisibleInDerivedContracts())
members.push_back(make_pair(function->getName(), make_shared<FunctionType>(*function, true))); members.push_back(make_pair(function->getName(), make_shared<FunctionType>(*function, true)));
} }
else else