package com.github.sommeri.less4j.core.compiler.selectors; import java.util.List; import com.github.sommeri.less4j.core.ast.ASTCssNodeType; import com.github.sommeri.less4j.core.ast.ElementSubsequent; import com.github.sommeri.less4j.core.ast.SelectorPart; import com.github.sommeri.less4j.core.ast.SimpleSelector; import com.github.sommeri.less4j.core.problems.BugHappened; import com.github.sommeri.less4j.utils.ListsComparator.ListMemberComparator; public class SelectorPartComparator implements ListMemberComparator<SelectorPart> { private final SimpleSelectorComparator simpleSelectorComparator; public SelectorPartComparator(SimpleSelectorComparator simpleSelectorComparator) { this.simpleSelectorComparator = simpleSelectorComparator; } @Override public boolean equals(SelectorPart first, SelectorPart second) { if (!prefix(first, second)) return false; //this assumes that isSelectorPartPrefix thrown exception on anything that is not simple selector List<ElementSubsequent> firstSubsequent = ((SimpleSelector) first).getSubsequent(); List<ElementSubsequent> secondSubsequent = ((SimpleSelector) second).getSubsequent(); return firstSubsequent.size() == secondSubsequent.size(); } @Override public boolean prefix(SelectorPart lookFor, SelectorPart inside) { validateSimpleSelector(lookFor); validateSimpleSelector(inside); return simpleSelectorComparator.prefix((SimpleSelector) lookFor, (SimpleSelector) inside); } private void validateSimpleSelector(SelectorPart selector) { if (selector.getType() != ASTCssNodeType.SIMPLE_SELECTOR) { throw new BugHappened("Unexpected selector part type " + selector.getType() + ". Anything but simple selector should have been removed from tree. ", selector); } } @Override public boolean suffix(SelectorPart lookFor, SelectorPart inside) { validateSimpleSelector(lookFor); validateSimpleSelector(inside); return simpleSelectorComparator.suffix((SimpleSelector) lookFor, (SimpleSelector) inside); } public SelectorPart cutSuffix(SelectorPart lookFor, SelectorPart inside) { validateSimpleSelector(lookFor); validateSimpleSelector(inside); SimpleSelector remainder = simpleSelectorComparator.cutSuffix((SimpleSelector) lookFor, (SimpleSelector) inside); return remainder; } public SelectorPart cutPrefix(SelectorPart lookFor, SelectorPart inside) { validateSimpleSelector(lookFor); validateSimpleSelector(inside); SimpleSelector remainder = simpleSelectorComparator.cutPrefix((SimpleSelector) lookFor, (SimpleSelector) inside); return remainder; } public boolean contains(SelectorPart lookFor, SelectorPart inside) { validateSimpleSelector(lookFor); validateSimpleSelector(inside); return simpleSelectorComparator.contains((SimpleSelector) lookFor, (SimpleSelector) inside); } public SelectorPart[] splitOn(SelectorPart lookFor, SelectorPart inside) { validateSimpleSelector(lookFor); validateSimpleSelector(inside); return simpleSelectorComparator.splitOn((SimpleSelector) lookFor, (SimpleSelector) inside); } }