From 1b0ef0b785d195ca28aa756047da040b676f5fc9 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Wed, 12 Jul 2017 23:15:52 +0100 Subject: Add sourceUnit() helper to Declaration --- libsolidity/ast/AST.cpp | 9 +++++++-- libsolidity/ast/AST.h | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) (limited to 'libsolidity') diff --git a/libsolidity/ast/AST.cpp b/libsolidity/ast/AST.cpp index 724a908f..1e1e4839 100644 --- a/libsolidity/ast/AST.cpp +++ b/libsolidity/ast/AST.cpp @@ -84,13 +84,18 @@ SourceUnitAnnotation& SourceUnit::annotation() const return dynamic_cast(*m_annotation); } -string Declaration::sourceUnitName() const +SourceUnit const& Declaration::sourceUnit() const { solAssert(!!m_scope, ""); ASTNode const* scope = m_scope; while (dynamic_cast(scope) && dynamic_cast(scope)->m_scope) scope = dynamic_cast(scope)->m_scope; - return dynamic_cast(*scope).annotation().path; + return dynamic_cast(*scope); +} + +string Declaration::sourceUnitName() const +{ + return sourceUnit().annotation().path; } ImportAnnotation& ImportDirective::annotation() const diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h index 81ddc754..41785780 100644 --- a/libsolidity/ast/AST.h +++ b/libsolidity/ast/AST.h @@ -168,6 +168,9 @@ public: ASTNode const* scope() const { return m_scope; } void setScope(ASTNode const* _scope) { m_scope = _scope; } + /// @returns the source unit this declaration is present in. + SourceUnit const& sourceUnit() const; + /// @returns the source name this declaration is present in. /// Can be combined with annotation().canonicalName to form a globally unique name. std::string sourceUnitName() const; -- cgit v1.2.3 From a9bddf71aaca7fb6e00292b788479a465b867faf Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 13 Jul 2017 00:08:28 +0100 Subject: Add referencedSourceUnits() helper --- libsolidity/ast/AST.cpp | 10 ++++++++++ libsolidity/ast/AST.h | 3 +++ 2 files changed, 13 insertions(+) (limited to 'libsolidity') diff --git a/libsolidity/ast/AST.cpp b/libsolidity/ast/AST.cpp index 1e1e4839..c5fb35f6 100644 --- a/libsolidity/ast/AST.cpp +++ b/libsolidity/ast/AST.cpp @@ -84,6 +84,16 @@ SourceUnitAnnotation& SourceUnit::annotation() const return dynamic_cast(*m_annotation); } +vector SourceUnit::referencedSourceUnits() const +{ + vector sourceUnits; + for (ImportDirective const* importDirective: filteredNodes(nodes())) + { + sourceUnits.push_back(importDirective->annotation().sourceUnit); + } + return sourceUnits; +} + SourceUnit const& Declaration::sourceUnit() const { solAssert(!!m_scope, ""); diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h index 41785780..e2117613 100644 --- a/libsolidity/ast/AST.h +++ b/libsolidity/ast/AST.h @@ -136,6 +136,9 @@ public: std::vector> nodes() const { return m_nodes; } + /// @returns a vector of referenced SourceUnits. + std::vector referencedSourceUnits() const; + private: std::vector> m_nodes; }; -- cgit v1.2.3 From ed592d6ccb9a8a088dc8153baae78f771304a257 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 13 Jul 2017 00:17:25 +0100 Subject: Add option to recurse referencedSourceUnits --- libsolidity/ast/AST.cpp | 11 ++++++++--- libsolidity/ast/AST.h | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) (limited to 'libsolidity') diff --git a/libsolidity/ast/AST.cpp b/libsolidity/ast/AST.cpp index c5fb35f6..a126e6ed 100644 --- a/libsolidity/ast/AST.cpp +++ b/libsolidity/ast/AST.cpp @@ -84,12 +84,17 @@ SourceUnitAnnotation& SourceUnit::annotation() const return dynamic_cast(*m_annotation); } -vector SourceUnit::referencedSourceUnits() const +set SourceUnit::referencedSourceUnits(bool _recurse) const { - vector sourceUnits; + set sourceUnits; for (ImportDirective const* importDirective: filteredNodes(nodes())) { - sourceUnits.push_back(importDirective->annotation().sourceUnit); + sourceUnits.insert(importDirective->annotation().sourceUnit); + if (_recurse) + { + set referencedSourceUnits = importDirective->annotation().sourceUnit->referencedSourceUnits(true); + sourceUnits.insert(referencedSourceUnits.begin(), referencedSourceUnits.end()); + } } return sourceUnits; } diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h index e2117613..2522867b 100644 --- a/libsolidity/ast/AST.h +++ b/libsolidity/ast/AST.h @@ -136,8 +136,8 @@ public: std::vector> nodes() const { return m_nodes; } - /// @returns a vector of referenced SourceUnits. - std::vector referencedSourceUnits() const; + /// @returns a set of referenced SourceUnits. Recursively if @a _recurse is true. + std::set referencedSourceUnits(bool _recurse = false) const; private: std::vector> m_nodes; -- cgit v1.2.3 From c617336587b976afc3dbe388ebaa8605c3d6fe54 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 13 Jul 2017 00:47:15 +0100 Subject: Only include files usde in metadata --- libsolidity/interface/CompilerStack.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'libsolidity') diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 7a87875c..9b630c31 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -780,9 +780,18 @@ string CompilerStack::createMetadata(Contract const& _contract) const meta["language"] = "Solidity"; meta["compiler"]["version"] = VersionStringStrict; + /// All the source files (including self), which should be included in the metadata. + set referencedSources; + referencedSources.insert(_contract.contract->sourceUnit().annotation().path); + for (auto const sourceUnit: _contract.contract->sourceUnit().referencedSourceUnits(true)) + referencedSources.insert(sourceUnit->annotation().path); + meta["sources"] = Json::objectValue; for (auto const& s: m_sources) { + if (!referencedSources.count(s.first)) + continue; + solAssert(s.second.scanner, "Scanner not available"); meta["sources"][s.first]["keccak256"] = "0x" + toHex(dev::keccak256(s.second.scanner->source()).asBytes()); -- cgit v1.2.3 From 89a1e97e7dd8a9af5a5fe2c5530cf4217c79f43b Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 13 Jul 2017 01:07:23 +0100 Subject: Avoid cyclic imports in referencedSourceUnits --- libsolidity/ast/AST.cpp | 15 ++++++++++----- libsolidity/ast/AST.h | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) (limited to 'libsolidity') diff --git a/libsolidity/ast/AST.cpp b/libsolidity/ast/AST.cpp index a126e6ed..f4ab6491 100644 --- a/libsolidity/ast/AST.cpp +++ b/libsolidity/ast/AST.cpp @@ -84,16 +84,21 @@ SourceUnitAnnotation& SourceUnit::annotation() const return dynamic_cast(*m_annotation); } -set SourceUnit::referencedSourceUnits(bool _recurse) const +set SourceUnit::referencedSourceUnits(bool _recurse, set _skipList) const { set sourceUnits; for (ImportDirective const* importDirective: filteredNodes(nodes())) { - sourceUnits.insert(importDirective->annotation().sourceUnit); - if (_recurse) + auto const& sourceUnit = importDirective->annotation().sourceUnit; + if (!_skipList.count(sourceUnit)) { - set referencedSourceUnits = importDirective->annotation().sourceUnit->referencedSourceUnits(true); - sourceUnits.insert(referencedSourceUnits.begin(), referencedSourceUnits.end()); + _skipList.insert(sourceUnit); + sourceUnits.insert(sourceUnit); + if (_recurse) + { + set referencedSourceUnits = sourceUnit->referencedSourceUnits(true, _skipList); + sourceUnits.insert(referencedSourceUnits.begin(), referencedSourceUnits.end()); + } } } return sourceUnits; diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h index 2522867b..8012bcb4 100644 --- a/libsolidity/ast/AST.h +++ b/libsolidity/ast/AST.h @@ -137,7 +137,7 @@ public: std::vector> nodes() const { return m_nodes; } /// @returns a set of referenced SourceUnits. Recursively if @a _recurse is true. - std::set referencedSourceUnits(bool _recurse = false) const; + std::set referencedSourceUnits(bool _recurse = false, std::set _skipList = std::set()) const; private: std::vector> m_nodes; -- cgit v1.2.3 From f3e591eedd19b181e71682c8dd5d032b52cdced8 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 14 Jul 2017 01:17:52 +0200 Subject: Add template for merging sets --- libsolidity/ast/AST.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'libsolidity') diff --git a/libsolidity/ast/AST.cpp b/libsolidity/ast/AST.cpp index f4ab6491..ebc8bd48 100644 --- a/libsolidity/ast/AST.cpp +++ b/libsolidity/ast/AST.cpp @@ -95,10 +95,7 @@ set SourceUnit::referencedSourceUnits(bool _recurse, set referencedSourceUnits = sourceUnit->referencedSourceUnits(true, _skipList); - sourceUnits.insert(referencedSourceUnits.begin(), referencedSourceUnits.end()); - } + sourceUnits += sourceUnit->referencedSourceUnits(true, _skipList); } } return sourceUnits; -- cgit v1.2.3