aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/analysis/TypeChecker.cpp
diff options
context:
space:
mode:
authorFederico Bond <federicobond@gmail.com>2017-09-30 06:45:56 +0800
committerFederico Bond <federicobond@gmail.com>2017-09-30 06:45:56 +0800
commit1e7b6875b7c5ddc9d257bac65e17d25b8f26fdd2 (patch)
treecd036a0ce04fd360857378fd716bccf21334fee9 /libsolidity/analysis/TypeChecker.cpp
parent6d9544795543498e9bc92943c41f07c2daf3bb78 (diff)
downloaddexon-solidity-1e7b6875b7c5ddc9d257bac65e17d25b8f26fdd2.tar
dexon-solidity-1e7b6875b7c5ddc9d257bac65e17d25b8f26fdd2.tar.gz
dexon-solidity-1e7b6875b7c5ddc9d257bac65e17d25b8f26fdd2.tar.bz2
dexon-solidity-1e7b6875b7c5ddc9d257bac65e17d25b8f26fdd2.tar.lz
dexon-solidity-1e7b6875b7c5ddc9d257bac65e17d25b8f26fdd2.tar.xz
dexon-solidity-1e7b6875b7c5ddc9d257bac65e17d25b8f26fdd2.tar.zst
dexon-solidity-1e7b6875b7c5ddc9d257bac65e17d25b8f26fdd2.zip
Extract duplicate function or event finding logic
Diffstat (limited to 'libsolidity/analysis/TypeChecker.cpp')
-rw-r--r--libsolidity/analysis/TypeChecker.cpp48
1 files changed, 11 insertions, 37 deletions
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index 60154758..d45e9e89 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -184,39 +184,8 @@ void TypeChecker::checkContractDuplicateFunctions(ContractDefinition const& _con
msg
);
}
- for (auto const& it: functions)
- {
- vector<FunctionDefinition const*> const& overloads = it.second;
- set<size_t> reported;
- for (size_t i = 0; i < overloads.size() && !reported.count(i); ++i)
- {
- SecondarySourceLocation ssl;
-
- for (size_t j = i + 1; j < overloads.size(); ++j)
- if (FunctionType(*overloads[i]).hasEqualArgumentTypes(FunctionType(*overloads[j])))
- {
- ssl.append("Other declaration is here:", overloads[j]->location());
- reported.insert(j);
- }
- if (ssl.infos.size() > 0)
- {
- string msg = "Function with same name and arguments defined twice.";
- size_t occurrences = ssl.infos.size();
- if (occurrences > 32)
- {
- ssl.infos.resize(32);
- msg += " Truncated from " + boost::lexical_cast<string>(occurrences) + " to the first 32 occurrences.";
- }
-
- m_errorReporter.declarationError(
- overloads[i]->location(),
- ssl,
- msg
- );
- }
- }
- }
+ findDuplicateDefinitions(functions, "Function with same name and arguments defined twice.");
}
void TypeChecker::checkContractDuplicateEvents(ContractDefinition const& _contract)
@@ -227,9 +196,15 @@ void TypeChecker::checkContractDuplicateEvents(ContractDefinition const& _contra
for (EventDefinition const* event: _contract.events())
events[event->name()].push_back(event);
- for (auto const& it: events)
+ findDuplicateDefinitions(events, "Event with same name and arguments defined twice.");
+}
+
+template <class T>
+void TypeChecker::findDuplicateDefinitions(map<string, vector<T>> const& _definitions, string _message)
+{
+ for (auto const& it: _definitions)
{
- vector<EventDefinition const*> const& overloads = it.second;
+ vector<T> const& overloads = it.second;
set<size_t> reported;
for (size_t i = 0; i < overloads.size() && !reported.count(i); ++i)
{
@@ -244,18 +219,17 @@ void TypeChecker::checkContractDuplicateEvents(ContractDefinition const& _contra
if (ssl.infos.size() > 0)
{
- string msg = "Event with same name and arguments defined twice.";
size_t occurrences = ssl.infos.size();
if (occurrences > 32)
{
ssl.infos.resize(32);
- msg += " Truncated from " + boost::lexical_cast<string>(occurrences) + " to the first 32 occurrences.";
+ _message += " Truncated from " + boost::lexical_cast<string>(occurrences) + " to the first 32 occurrences.";
}
m_errorReporter.declarationError(
overloads[i]->location(),
ssl,
- msg
+ _message
);
}
}