package com.github.sommeri.less4j.core.compiler.stages;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
import com.github.sommeri.less4j.core.ast.ASTCssNode;
import com.github.sommeri.less4j.core.ast.Directive;
import com.github.sommeri.less4j.core.ast.RuleSet;
import com.github.sommeri.less4j.core.ast.Selector;
import com.github.sommeri.less4j.core.compiler.selectors.SelectorsManipulator;
public class NestedInRulesetStack {
private final SelectorsManipulator selectorsManipulator = new SelectorsManipulator();
private Stack<List<Selector>> selectors = new Stack<List<Selector>>();
private LinkedList<ASTCssNode> nestedNodes = new LinkedList<ASTCssNode>();
public NestedInRulesetStack(RuleSet topLevelNode) {
List<Selector> topSelectors = new ArrayList<Selector>();
for (Selector selector : topLevelNode.getSelectors()) {
topSelectors.add(selectorsManipulator.removeAppenders(selector.clone()));
}
selectors.push(topSelectors);
}
public void popSelectors() {
selectors.pop();
}
public void pushSelectors(RuleSet kid) {
selectors.push(new ArrayList<Selector>(kid.getSelectors()));
}
public List<ASTCssNode> getRulesets() {
return nestedNodes;
}
public void collect(RuleSet nestedSet) {
combine(nestedSet, selectors.peek());
nestedNodes.add(nestedSet);
}
public void collect(Directive directive) {
nestedNodes.add(directive);
}
private void combine(RuleSet ruleSet, List<Selector> previousSelectors) {
List<Selector> result = new ArrayList<Selector>();
for (Selector selector : ruleSet.getSelectors()) {
// FIXME: meri: review whether they have all the right visibility in the
// end
result.addAll(selectorsManipulator.replaceAppenders(selector, previousSelectors));
}
ruleSet.replaceSelectors(result);
ruleSet.configureParentToAllChilds();
}
public List<Selector> currentSelectors() {
return selectors.peek();
}
}