package com.github.sommeri.less4j.core.compiler.stages;
import java.util.ArrayList;
import java.util.List;
import com.github.sommeri.less4j.core.ast.ASTCssNode;
import com.github.sommeri.less4j.core.ast.Body;
import com.github.sommeri.less4j.core.ast.Declaration;
import com.github.sommeri.less4j.core.ast.RuleSet;
public abstract class TreeDeclarationsVisitor {
public void apply(ASTCssNode node) {
switch (node.getType()) {
case RULE_SET:
RuleSet ruleset = (RuleSet) node;
rulesetsBodyPropertiesMerger(ruleset.getBody());
break;
case CHARSET_DECLARATION:
case IMPORT:
break;
default:
applyToKidsProperties(node);
}
}
private void applyToKidsProperties(ASTCssNode node) {
List<ASTCssNode> childs = new ArrayList<ASTCssNode>(node.getChilds());
for (ASTCssNode kid : childs) {
apply(kid);
}
}
private void rulesetsBodyPropertiesMerger(Body node) {
enteringBody(node);
List<? extends ASTCssNode> childs = node.getChilds();
for (ASTCssNode kid : childs) {
switch (kid.getType()) {
case DECLARATION:
applyToDeclaration((Declaration) kid);
break;
default:
applyToKidsProperties(kid);
break;
}
}
leavingBody(node);
}
protected abstract void applyToDeclaration(Declaration declaration);
protected abstract void enteringBody(Body node);
protected abstract void leavingBody(Body node);
}