aboutsummaryrefslogtreecommitdiffstats
path: root/NameAndTypeResolver.cpp
diff options
context:
space:
mode:
authorLiana Husikyan <liana@ethdev.com>2015-05-07 22:52:06 +0800
committerLiana Husikyan <liana@ethdev.com>2015-05-08 23:51:52 +0800
commit495d827eceb2f8160421d0f7ce86d1183b54b3de (patch)
tree774b97de98757e679eb960c05ee669fdd5dfc359 /NameAndTypeResolver.cpp
parent115c22c0e001fd0f9c440c45b33009bfe99697f8 (diff)
downloaddexon-solidity-495d827eceb2f8160421d0f7ce86d1183b54b3de.tar.gz
dexon-solidity-495d827eceb2f8160421d0f7ce86d1183b54b3de.tar.zst
dexon-solidity-495d827eceb2f8160421d0f7ce86d1183b54b3de.zip
implemented cleanup of duplication in resolver
Diffstat (limited to 'NameAndTypeResolver.cpp')
-rw-r--r--NameAndTypeResolver.cpp25
1 files changed, 19 insertions, 6 deletions
diff --git a/NameAndTypeResolver.cpp b/NameAndTypeResolver.cpp
index 4d33048d..ac841fcc 100644
--- a/NameAndTypeResolver.cpp
+++ b/NameAndTypeResolver.cpp
@@ -132,12 +132,14 @@ vector<Declaration const*> NameAndTypeResolver::getNameFromCurrentScope(ASTStrin
vector<Declaration const*> NameAndTypeResolver::cleanupedDeclarations(Identifier const& _identifier)
{
- vector<Declaration const*> result;
- for (auto declaration : m_currentScope->resolveName(_identifier.getName()))
+ vector<Declaration const*> uniqueFunctions;
+
+ auto declarations = m_currentScope->resolveName(_identifier.getName());
+ for (auto it = declarations.begin(); it != declarations.end(); ++it)
{
- solAssert(declaration, "");
+ solAssert(*it, "");
// the declaration is functionDefinition while declarations > 1
- FunctionDefinition const& functionDefinition = dynamic_cast<FunctionDefinition const&>(*declaration);
+ FunctionDefinition const& functionDefinition = dynamic_cast<FunctionDefinition const&>(**it);
FunctionType functionType(functionDefinition);
for(auto parameter: functionType.getParameterTypes() + functionType.getReturnParameterTypes())
if (!parameter)
@@ -146,9 +148,20 @@ vector<Declaration const*> NameAndTypeResolver::cleanupedDeclarations(Identifier
errinfo_sourceLocation(_identifier.getLocation()) <<
errinfo_comment("Function type can not be used in this context")
);
- //////////delete repitations. check by hasequalparameter types of function type
+ if (uniqueFunctions.end() == find_if(
+ uniqueFunctions.begin(),
+ uniqueFunctions.end(),
+ [&](Declaration const* d)
+ {
+ FunctionDefinition const& newFunctionDefinition = dynamic_cast<FunctionDefinition const&>(*d);
+ FunctionType newFunctionType(newFunctionDefinition);
+
+ return functionType.hasEqualArgumentTypes(newFunctionType);
+ }
+ ))
+ uniqueFunctions.push_back(*it);
}
- return result;
+ return uniqueFunctions;
}
void NameAndTypeResolver::importInheritedScope(ContractDefinition const& _base)