package com.github.sommeri.less4j.core.compiler.selectors;
import com.github.sommeri.less4j.core.ast.ASTCssNode;
import com.github.sommeri.less4j.core.ast.Expression;
import com.github.sommeri.less4j.core.ast.Nth;
import com.github.sommeri.less4j.core.ast.Selector;
import com.github.sommeri.less4j.core.compiler.expressions.FormalisticExpressionComparator;
import com.github.sommeri.less4j.core.problems.BugHappened;
public class GeneralComparatorForExtend {
private FormalisticExpressionComparator formal = new FormalisticExpressionComparator();
private SelectorsComparatorForExtend selectorsComparator = new SelectorsComparatorForExtend(this);
private NthComparatorForExtend nthComparator = new NthComparatorForExtend();
public boolean equals(ASTCssNode node1, ASTCssNode node2) {
if (node1==null && node2==null)
return true;
if (node1==null || node2==null)
return false;
if (isExpression(node1) && isExpression(node2))
return formal.equal((Expression) node1, (Expression) node2);
if (node1.getType()!=node2.getType())
return false;
switch (node1.getType()) {
case SELECTOR:
return selectorsComparator.equals((Selector) node1, (Selector) node2);
case NTH:
return nthComparator.equals((Nth) node1, (Nth) node2);
default:
throw new BugHappened("Need to compare unexpected node types. " + node1 + " with " + node2, node1);
}
}
private boolean isExpression(ASTCssNode node) {
return (node instanceof Expression);
}
public boolean contains(Selector lookFor, Selector inSelector) {
return selectorsComparator.contains(lookFor, inSelector);
}
public Selector replaceInside(Selector lookFor, Selector inSelector, Selector replaceBy) {
return selectorsComparator.replace(lookFor, inSelector, replaceBy);
}
}