mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Import directive.
This commit is contained in:
@@ -33,6 +33,19 @@ namespace dev
|
||||
namespace solidity
|
||||
{
|
||||
|
||||
void SourceUnit::accept(ASTVisitor& _visitor)
|
||||
{
|
||||
if (_visitor.visit(*this))
|
||||
listAccept(m_nodes, _visitor);
|
||||
_visitor.endVisit(*this);
|
||||
}
|
||||
|
||||
void ImportDirective::accept(ASTVisitor& _visitor)
|
||||
{
|
||||
_visitor.visit(*this);
|
||||
_visitor.endVisit(*this);
|
||||
}
|
||||
|
||||
void ContractDefinition::accept(ASTVisitor& _visitor)
|
||||
{
|
||||
if (_visitor.visit(*this))
|
||||
@@ -57,34 +70,6 @@ void StructDefinition::checkValidityOfMembers()
|
||||
checkRecursion();
|
||||
}
|
||||
|
||||
void StructDefinition::checkMemberTypes()
|
||||
{
|
||||
for (ASTPointer<VariableDeclaration> const& member: getMembers())
|
||||
if (!member->getType()->canBeStored())
|
||||
BOOST_THROW_EXCEPTION(member->createTypeError("Type cannot be used in struct."));
|
||||
}
|
||||
|
||||
void StructDefinition::checkRecursion()
|
||||
{
|
||||
set<StructDefinition const*> definitionsSeen;
|
||||
vector<StructDefinition const*> queue = {this};
|
||||
while (!queue.empty())
|
||||
{
|
||||
StructDefinition const* def = queue.back();
|
||||
queue.pop_back();
|
||||
if (definitionsSeen.count(def))
|
||||
BOOST_THROW_EXCEPTION(ParserError() << errinfo_sourceLocation(def->getLocation())
|
||||
<< errinfo_comment("Recursive struct definition."));
|
||||
definitionsSeen.insert(def);
|
||||
for (ASTPointer<VariableDeclaration> const& member: def->getMembers())
|
||||
if (member->getType()->getCategory() == Type::Category::STRUCT)
|
||||
{
|
||||
UserDefinedTypeName const& typeName = dynamic_cast<UserDefinedTypeName&>(*member->getTypeName());
|
||||
queue.push_back(&dynamic_cast<StructDefinition const&>(*typeName.getReferencedDeclaration()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ParameterList::accept(ASTVisitor& _visitor)
|
||||
{
|
||||
if (_visitor.visit(*this))
|
||||
@@ -312,6 +297,34 @@ vector<FunctionDefinition const*> ContractDefinition::getInterfaceFunctions() co
|
||||
return exportedFunctions;
|
||||
}
|
||||
|
||||
void StructDefinition::checkMemberTypes()
|
||||
{
|
||||
for (ASTPointer<VariableDeclaration> const& member: getMembers())
|
||||
if (!member->getType()->canBeStored())
|
||||
BOOST_THROW_EXCEPTION(member->createTypeError("Type cannot be used in struct."));
|
||||
}
|
||||
|
||||
void StructDefinition::checkRecursion()
|
||||
{
|
||||
set<StructDefinition const*> definitionsSeen;
|
||||
vector<StructDefinition const*> queue = {this};
|
||||
while (!queue.empty())
|
||||
{
|
||||
StructDefinition const* def = queue.back();
|
||||
queue.pop_back();
|
||||
if (definitionsSeen.count(def))
|
||||
BOOST_THROW_EXCEPTION(ParserError() << errinfo_sourceLocation(def->getLocation())
|
||||
<< errinfo_comment("Recursive struct definition."));
|
||||
definitionsSeen.insert(def);
|
||||
for (ASTPointer<VariableDeclaration> const& member: def->getMembers())
|
||||
if (member->getType()->getCategory() == Type::Category::STRUCT)
|
||||
{
|
||||
UserDefinedTypeName const& typeName = dynamic_cast<UserDefinedTypeName&>(*member->getTypeName());
|
||||
queue.push_back(&dynamic_cast<StructDefinition const&>(*typeName.getReferencedDeclaration()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FunctionDefinition::checkTypeRequirements()
|
||||
{
|
||||
for (ASTPointer<VariableDeclaration> const& var: getParameters() + getReturnParameters())
|
||||
|
||||
Reference in New Issue
Block a user