package com.github.sommeri.less4j.core.compiler.expressions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Stack;
import com.github.sommeri.less4j.core.ast.Variable;
public class VariableCycleDetector {
// since names are evaluated lazily, we can ignore the scope and consider variable name only
private Stack<String> names = new Stack<String>();
private Stack<Variable> variables = new Stack<Variable>();
protected VariableCycleDetector() {
}
public boolean wouldCycle(Variable input) {
return names.contains(input.getName());
}
public void leftVariableValue() {
names.pop();
variables.pop();
}
public void enteringVariableValue(Variable input) {
names.add(input.getName());
variables.add(input);
}
public List<Variable> getCycleFor(Variable input) {
if (!wouldCycle(input))
return Collections.emptyList();
int position = names.indexOf(input.getName());
List<Variable> result = new ArrayList<Variable>(variables.subList(position, variables.size()));
result.add(input);
return result;
}
}