package driver; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import files.BackedRequire; import files.Require; /** * Manages the require statements included in a source file. A member of * CTimeFile. * * Require statements are kept as BackedRequire objects. */ public class Requires { /****************************************************************************/ private final Map<SourceFile, Set<BackedRequire>> map = new HashMap<>(); /****************************************************************************/ private final Set<BackedRequire> all = new HashSet<>(); /****************************************************************************/ @Override public String toString() { return map.values().toString(); } /***************************************************************************** * Adds all Require's to this collection, using the Context's * CTimeFileRepository to find the backing source files. */ void addAll(List<Require> requires) { SourceRepository repo = Context.get().repo; for (Require require : requires) { add(repo, require); } } /***************************************************************************** * Adds the Require to this collection, using $repo to find the backing source * file. */ void add(SourceRepository repo, Require require) { SourceFile file = repo.get(require.relativePath()); add(new BackedRequire(require, file)); } /****************************************************************************/ void add(BackedRequire require) { Set<BackedRequire> set = map.get(require.file()); if (set == null) { set = new HashSet<BackedRequire>(); map.put(require.file(), set); } set.add(require); all.add(require); } /****************************************************************************/ Set<SourceFile> dependencies() { return map.keySet(); } /****************************************************************************/ Collection<BackedRequire> get() { return all; } /****************************************************************************/ List<String> imports() { List<String> out = new ArrayList<>(all.size()); for (BackedRequire breq : all) { String importString = breq.require().importString(); if (!importString.isEmpty()) { out.add(importString); } } return out; } }