package de.gaalop.cfg;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import de.gaalop.dfg.Variable;
public final class VariableScope {
/** Special scope representing global scope. */
public static final VariableScope GLOBAL = new VariableScope();
private static int num;
private String name;
private Set<Variable> variables = new HashSet<Variable>();
private VariableScope parent;
/**
* Private constructor for global scope only.
*/
private VariableScope() {
parent = this;
name = "GLOBAL";
}
public VariableScope(VariableScope parent) {
this.parent = parent;
name = Integer.toString(++num);
}
public void addVariable(Variable v) {
variables.add(v);
}
public void removeVariable(Variable v) {
variables.remove(v);
}
public VariableScope getParent() {
return parent;
}
public Set<Variable> getDefinedVariables() {
return variables;
}
/**
* Checks if the given variable name is defined in this scope or its parents.
*
* @param name name of variable to be checked
* @return true, if given name is defined in this or one of the parents' scope
*/
public boolean containsDefinition(String name) {
for (Variable v : variables) {
if (v.getName().equals(name)) {
return true;
}
}
if (this != GLOBAL) {
return parent.containsDefinition(name);
} else {
return false;
}
}
@Override
public String toString() {
String result = name + "=";
result += Arrays.toString(variables.toArray());
return result;
}
}