package udg.useDefAnalysis.environments; import java.util.Collection; import java.util.LinkedList; import udg.ASTProvider; import udg.useDefGraph.UseOrDef; /** * Base-class and default implementation of UseDefEnvironment. * */ public class UseDefEnvironment { protected ASTProvider astProvider; LinkedList<String> symbols = new LinkedList<String>(); static final LinkedList<UseOrDef> emptyUseOrDef = new LinkedList<UseOrDef>(); static final LinkedList<String> emptySymbolList = new LinkedList<String>(); public boolean isUse(ASTProvider child) { return false; } public boolean isDef(ASTProvider child) { return false; } public boolean shouldTraverse(ASTProvider child) { return true; } public void setASTProvider(ASTProvider anASTProvider) { this.astProvider = anASTProvider; } public ASTProvider getASTProvider() { return astProvider; } /** * Propagate all symbols to upstream * */ public LinkedList<String> upstreamSymbols() { return symbols; } /** * Add all given symbols without exception **/ public void addChildSymbols(LinkedList<String> childSymbols, ASTProvider child) { symbols.addAll(childSymbols); } /** * By default, don't generate any uses or defs for symbols. * */ public Collection<UseOrDef> useOrDefsFromSymbols(ASTProvider child) { return emptyUseOrDef; } /* Utilities below */ protected LinkedList<UseOrDef> createDefsForAllSymbols( Collection<String> symbols) { return createDefOrUseForSymbols(symbols, true); } protected LinkedList<UseOrDef> createUsesForAllSymbols( Collection<String> symbols) { return createDefOrUseForSymbols(symbols, false); } private LinkedList<UseOrDef> createDefOrUseForSymbols( Collection<String> symbols, boolean isDef) { LinkedList<UseOrDef> retval = new LinkedList<UseOrDef>(); for (String s : symbols) { UseOrDef useOrDef = new UseOrDef(); useOrDef.isDef = isDef; useOrDef.symbol = s; useOrDef.astProvider = this.astProvider; retval.add(useOrDef); } return retval; } };