Provide optional list of contract names to CompilerStack.compile

This commit is contained in:
Alex Beregszaszi 2017-09-13 19:43:16 +01:00
parent 19274c7890
commit f96e932243
2 changed files with 21 additions and 1 deletions

View File

@ -252,6 +252,14 @@ bool CompilerStack::parseAndAnalyze()
return parse() && analyze(); return parse() && analyze();
} }
bool CompilerStack::isRequestedContract(ContractDefinition const& _contract) const
{
return
m_requestedContractNames.empty() ||
m_requestedContractNames.count(_contract.fullyQualifiedName()) ||
m_requestedContractNames.count(_contract.name());
}
bool CompilerStack::compile() bool CompilerStack::compile()
{ {
if (m_stackState < AnalysisSuccessful) if (m_stackState < AnalysisSuccessful)
@ -262,7 +270,8 @@ bool CompilerStack::compile()
for (Source const* source: m_sourceOrder) for (Source const* source: m_sourceOrder)
for (ASTPointer<ASTNode> const& node: source->ast->nodes()) for (ASTPointer<ASTNode> const& node: source->ast->nodes())
if (auto contract = dynamic_cast<ContractDefinition const*>(node.get())) if (auto contract = dynamic_cast<ContractDefinition const*>(node.get()))
compileContract(*contract, compiledContracts); if (isRequestedContract(*contract))
compileContract(*contract, compiledContracts);
this->link(); this->link();
m_stackState = CompilationSuccessful; m_stackState = CompilationSuccessful;
return true; return true;

View File

@ -116,6 +116,13 @@ public:
m_optimizeRuns = _runs; m_optimizeRuns = _runs;
} }
/// Sets the list of requested contract names. If empty, no filtering is performed and every contract
/// found in the supplied sources is compiled. Names are cleared iff @a _contractNames is missing.
void setRequestedContractNames(std::set<std::string> const& _contractNames = std::set<std::string>{})
{
m_requestedContractNames = _contractNames;
}
/// @arg _metadataLiteralSources When true, store sources as literals in the contract metadata. /// @arg _metadataLiteralSources When true, store sources as literals in the contract metadata.
void useMetadataLiteralSources(bool _metadataLiteralSources) { m_metadataLiteralSources = _metadataLiteralSources; } void useMetadataLiteralSources(bool _metadataLiteralSources) { m_metadataLiteralSources = _metadataLiteralSources; }
@ -259,6 +266,9 @@ private:
/// Helper function to return path converted strings. /// Helper function to return path converted strings.
std::string sanitizePath(std::string const& _path) const { return boost::filesystem::path(_path).generic_string(); } std::string sanitizePath(std::string const& _path) const { return boost::filesystem::path(_path).generic_string(); }
/// @returns true if the contract is requested to be compiled.
bool isRequestedContract(ContractDefinition const& _contract) const;
/// Compile a single contract and put the result in @a _compiledContracts. /// Compile a single contract and put the result in @a _compiledContracts.
void compileContract( void compileContract(
ContractDefinition const& _contract, ContractDefinition const& _contract,
@ -297,6 +307,7 @@ private:
ReadCallback::Callback m_smtQuery; ReadCallback::Callback m_smtQuery;
bool m_optimize = false; bool m_optimize = false;
unsigned m_optimizeRuns = 200; unsigned m_optimizeRuns = 200;
std::set<std::string> m_requestedContractNames;
std::map<std::string, h160> m_libraries; std::map<std::string, h160> m_libraries;
/// list of path prefix remappings, e.g. mylibrary: github.com/ethereum = /usr/local/ethereum /// list of path prefix remappings, e.g. mylibrary: github.com/ethereum = /usr/local/ethereum
/// "context:prefix=target" /// "context:prefix=target"