Avoid cyclic imports in referencedSourceUnits

This commit is contained in:
Alex Beregszaszi 2017-07-13 01:07:23 +01:00
parent c617336587
commit 89a1e97e7d
2 changed files with 11 additions and 6 deletions

View File

@ -84,16 +84,21 @@ SourceUnitAnnotation& SourceUnit::annotation() const
return dynamic_cast<SourceUnitAnnotation&>(*m_annotation); return dynamic_cast<SourceUnitAnnotation&>(*m_annotation);
} }
set<SourceUnit const*> SourceUnit::referencedSourceUnits(bool _recurse) const set<SourceUnit const*> SourceUnit::referencedSourceUnits(bool _recurse, set<SourceUnit const*> _skipList) const
{ {
set<SourceUnit const*> sourceUnits; set<SourceUnit const*> sourceUnits;
for (ImportDirective const* importDirective: filteredNodes<ImportDirective>(nodes())) for (ImportDirective const* importDirective: filteredNodes<ImportDirective>(nodes()))
{ {
sourceUnits.insert(importDirective->annotation().sourceUnit); auto const& sourceUnit = importDirective->annotation().sourceUnit;
if (_recurse) if (!_skipList.count(sourceUnit))
{ {
set<SourceUnit const*> referencedSourceUnits = importDirective->annotation().sourceUnit->referencedSourceUnits(true); _skipList.insert(sourceUnit);
sourceUnits.insert(referencedSourceUnits.begin(), referencedSourceUnits.end()); sourceUnits.insert(sourceUnit);
if (_recurse)
{
set<SourceUnit const*> referencedSourceUnits = sourceUnit->referencedSourceUnits(true, _skipList);
sourceUnits.insert(referencedSourceUnits.begin(), referencedSourceUnits.end());
}
} }
} }
return sourceUnits; return sourceUnits;

View File

@ -137,7 +137,7 @@ public:
std::vector<ASTPointer<ASTNode>> nodes() const { return m_nodes; } std::vector<ASTPointer<ASTNode>> nodes() const { return m_nodes; }
/// @returns a set of referenced SourceUnits. Recursively if @a _recurse is true. /// @returns a set of referenced SourceUnits. Recursively if @a _recurse is true.
std::set<SourceUnit const*> referencedSourceUnits(bool _recurse = false) const; std::set<SourceUnit const*> referencedSourceUnits(bool _recurse = false, std::set<SourceUnit const*> _skipList = std::set<SourceUnit const*>()) const;
private: private:
std::vector<ASTPointer<ASTNode>> m_nodes; std::vector<ASTPointer<ASTNode>> m_nodes;