mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
parent
ee7ef675c3
commit
ad459207a3
36
AST.cpp
36
AST.cpp
@ -175,24 +175,40 @@ void ContractDefinition::checkDuplicateFunctions() const
|
|||||||
|
|
||||||
void ContractDefinition::checkAbstractFunctions()
|
void ContractDefinition::checkAbstractFunctions()
|
||||||
{
|
{
|
||||||
map<string, bool> functions;
|
// Mapping from name to function definition (exactly one per argument type equality class) and
|
||||||
|
// flag to indicate whether it is fully implemented.
|
||||||
|
using FunTypeAndFlag = std::pair<FunctionTypePointer, bool>;
|
||||||
|
map<string, vector<FunTypeAndFlag>> functions;
|
||||||
|
|
||||||
// Search from base to derived
|
// Search from base to derived
|
||||||
for (ContractDefinition const* contract: boost::adaptors::reverse(getLinearizedBaseContracts()))
|
for (ContractDefinition const* contract: boost::adaptors::reverse(getLinearizedBaseContracts()))
|
||||||
for (ASTPointer<FunctionDefinition> const& function: contract->getDefinedFunctions())
|
for (ASTPointer<FunctionDefinition> const& function: contract->getDefinedFunctions())
|
||||||
{
|
{
|
||||||
string const& name = function->getName();
|
auto& overloads = functions[function->getName()];
|
||||||
if (!function->isFullyImplemented() && functions.count(name) && functions[name])
|
FunctionTypePointer funType = make_shared<FunctionType>(*function);
|
||||||
BOOST_THROW_EXCEPTION(function->createTypeError("Redeclaring an already implemented function as abstract"));
|
auto it = find_if(overloads.begin(), overloads.end(), [&](FunTypeAndFlag const& _funAndFlag)
|
||||||
functions[name] = function->isFullyImplemented();
|
{
|
||||||
|
return funType->hasEqualArgumentTypes(*_funAndFlag.first);
|
||||||
|
});
|
||||||
|
if (it == overloads.end())
|
||||||
|
overloads.push_back(make_pair(funType, function->isFullyImplemented()));
|
||||||
|
else if (it->second)
|
||||||
|
{
|
||||||
|
if (!function->isFullyImplemented())
|
||||||
|
BOOST_THROW_EXCEPTION(function->createTypeError("Redeclaring an already implemented function as abstract"));
|
||||||
|
}
|
||||||
|
else if (function->isFullyImplemented())
|
||||||
|
it->second = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set to not fully implemented if at least one flag is false.
|
||||||
for (auto const& it: functions)
|
for (auto const& it: functions)
|
||||||
if (!it.second)
|
for (auto const& funAndFlag: it.second)
|
||||||
{
|
if (!funAndFlag.second)
|
||||||
setFullyImplemented(false);
|
{
|
||||||
break;
|
setFullyImplemented(false);
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContractDefinition::checkAbstractConstructors()
|
void ContractDefinition::checkAbstractConstructors()
|
||||||
|
Loading…
Reference in New Issue
Block a user