package org.uva.ql.typechecker.dependency; import java.util.ArrayList; import java.util.List; import org.uva.ql.ast.expression.literal.Identifier; public class DependencyList { private final List<DependencyPair> dependencyClosure; public DependencyList() { dependencyClosure = new ArrayList<DependencyPair>(); } public void add(Identifier dominant, Identifier dependent) { DependencyPair pair = new DependencyPair(dominant, dependent); dependencyClosure.add(pair); } public List<DependencyPair> getClosure() { return dependencyClosure; } private boolean hasSameName(Identifier id1, Identifier id2) { return id1.toString().equals(id2.toString()); } public boolean contains(DependencyPair r) { for (DependencyPair i : dependencyClosure) { if (hasSameName(i.getDominant(), r.getDominant()) && hasSameName(i.getDependent(), r.getDependent())) { return true; } } return false; } private List<DependencyPair> getTransitiveClosure() { boolean isComplete = true; List<DependencyPair> copy = new ArrayList<DependencyPair>(dependencyClosure); for (DependencyPair i : copy) { for (DependencyPair j : copy) { if (hasSameName(i.getDependent(), j.getDominant())) { DependencyPair p = new DependencyPair(i.getDominant(), j.getDependent()); if (!contains(p)) { dependencyClosure.add(p); isComplete = false; } } } } if (!isComplete) { getTransitiveClosure(); } return dependencyClosure; } public List<Identifier> getCyclicDependentIdentifiers() { List<Identifier> identifiers = new ArrayList<Identifier>(); for (DependencyPair pair : getTransitiveClosure()) { if (pair.isCyclicDependent()) { identifiers.add(pair.getDominant()); } } return identifiers; } }