diff options
author | chriseth <chris@ethereum.org> | 2017-10-19 19:43:17 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-19 19:43:17 +0800 |
commit | 4e7d1440ab84ba0566c7c75ff61b2f9e70738ef4 (patch) | |
tree | f4983ffe53f5c63478c682219f6cfae221493cd6 /libsolidity/interface/CompilerStack.cpp | |
parent | b96602122c2380b1759a8f657a9b97e30c5978b0 (diff) | |
parent | 8d3cfa8cff85b1aed7c1b77a0886a58b09144a36 (diff) | |
download | dexon-solidity-4e7d1440ab84ba0566c7c75ff61b2f9e70738ef4.tar dexon-solidity-4e7d1440ab84ba0566c7c75ff61b2f9e70738ef4.tar.gz dexon-solidity-4e7d1440ab84ba0566c7c75ff61b2f9e70738ef4.tar.bz2 dexon-solidity-4e7d1440ab84ba0566c7c75ff61b2f9e70738ef4.tar.lz dexon-solidity-4e7d1440ab84ba0566c7c75ff61b2f9e70738ef4.tar.xz dexon-solidity-4e7d1440ab84ba0566c7c75ff61b2f9e70738ef4.tar.zst dexon-solidity-4e7d1440ab84ba0566c7c75ff61b2f9e70738ef4.zip |
Merge pull request #3101 from ethereum/compilerstack-header
Remove the reliance on empty contract name equals "last contract" in CompilerStack
Diffstat (limited to 'libsolidity/interface/CompilerStack.cpp')
-rw-r--r-- | libsolidity/interface/CompilerStack.cpp | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index b99fe4ee..5713256a 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -747,22 +747,32 @@ void CompilerStack::compileContract( } } +string const CompilerStack::lastContractName() const +{ + if (m_contracts.empty()) + BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("No compiled contracts found.")); + // try to find some user-supplied contract + string contractName; + for (auto const& it: m_sources) + for (ASTPointer<ASTNode> const& node: it.second.ast->nodes()) + if (auto contract = dynamic_cast<ContractDefinition const*>(node.get())) + contractName = contract->fullyQualifiedName(); + return contractName; +} + CompilerStack::Contract const& CompilerStack::contract(string const& _contractName) const { if (m_contracts.empty()) BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("No compiled contracts found.")); - string contractName = _contractName; - if (_contractName.empty()) - // try to find some user-supplied contract - for (auto const& it: m_sources) - for (ASTPointer<ASTNode> const& node: it.second.ast->nodes()) - if (auto contract = dynamic_cast<ContractDefinition const*>(node.get())) - contractName = contract->fullyQualifiedName(); - auto it = m_contracts.find(contractName); + + auto it = m_contracts.find(_contractName); + if (it != m_contracts.end()) + return it->second; + // To provide a measure of backward-compatibility, if a contract is not located by its // fully-qualified name, a lookup will be attempted purely on the contract's name to see // if anything will satisfy. - if (it == m_contracts.end() && contractName.find(":") == string::npos) + if (_contractName.find(":") == string::npos) { for (auto const& contractEntry: m_contracts) { @@ -773,12 +783,13 @@ CompilerStack::Contract const& CompilerStack::contract(string const& _contractNa string foundName; getline(ss, source, ':'); getline(ss, foundName, ':'); - if (foundName == contractName) return contractEntry.second; + if (foundName == _contractName) + return contractEntry.second; } - // If we get here, both lookup methods failed. - BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Contract " + _contractName + " not found.")); } - return it->second; + + // If we get here, both lookup methods failed. + BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Contract \"" + _contractName + "\" not found.")); } CompilerStack::Source const& CompilerStack::source(string const& _sourceName) const |