diff options
author | Rhett Aultman <roadriverrail@gmail.com> | 2016-12-12 15:58:01 +0800 |
---|---|---|
committer | Rhett Aultman <rhett.aultman@meraki.net> | 2017-01-17 01:32:57 +0800 |
commit | e3b0827721f114a371df57b7079205034683ed25 (patch) | |
tree | 3b836590826e1b1bf5aacdd1074de8f48f5b5a11 | |
parent | 8f25bd54e35dba3fb632c2d209a86acaba63d33d (diff) | |
download | dexon-solidity-e3b0827721f114a371df57b7079205034683ed25.tar.gz dexon-solidity-e3b0827721f114a371df57b7079205034683ed25.tar.zst dexon-solidity-e3b0827721f114a371df57b7079205034683ed25.zip |
Push the error instead of throwing it
Throwing a CompilerError on multiple contract definition violates the
expectations of the test suite, which thinks that compile() will
return false if the code can't compile. This brings contract
collision reporting in line with most of the other errors.
-rw-r--r-- | libsolidity/interface/CompilerStack.cpp | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 13cf7d6c..7626406c 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -186,13 +186,24 @@ bool CompilerStack::parse() { const ContractDefinition* existingContract = m_contracts.find(contract->fullyQualifiedName())->second.contract; if (contract != existingContract) - BOOST_THROW_EXCEPTION(CompilerError() << + { + auto err = make_shared<Error>(Error::Type::DeclarationError); + *err << errinfo_sourceLocation(contract->location()) << - errinfo_comment(contract->name() + " is already defined.") << - errinfo_secondarySourceLocation( - SecondarySourceLocation().append("Previous definition is here:", existingContract->location()))); + errinfo_comment( + "Contract/Library \"" + contract->name() + "\" declared twice " + ) << + errinfo_secondarySourceLocation(SecondarySourceLocation().append( + "The other declaration is here:", existingContract->location())); + + m_errors.push_back(err); + noErrors = false; + } + } + else + { + m_contracts[contract->fullyQualifiedName()].contract = contract; } - m_contracts[contract->fullyQualifiedName()].contract = contract; } if (!checkLibraryNameClashes()) @@ -216,14 +227,27 @@ bool CompilerStack::parse() if (m_contracts.find(contract->fullyQualifiedName()) != m_contracts.end()) { const ContractDefinition* existingContract = m_contracts.find(contract->fullyQualifiedName())->second.contract; + if (contract != existingContract) - BOOST_THROW_EXCEPTION(CompilerError() << + { + auto err = make_shared<Error>(Error::Type::DeclarationError); + *err << errinfo_sourceLocation(contract->location()) << - errinfo_comment(contract->name() + " is already defined at " - + *(existingContract->location().sourceName))); - } + errinfo_comment( + "Contract/Library \"" + contract->name() + "\" declared twice " + ) << + errinfo_secondarySourceLocation(SecondarySourceLocation().append( + "The other declaration is here:", existingContract->location())); - m_contracts[contract->fullyQualifiedName()].contract = contract; + m_errors.push_back(err); + noErrors = false; + } + + } + else + { + m_contracts[contract->fullyQualifiedName()].contract = contract; + } } if (noErrors) |