package com.github.sommeri.less4j.core.compiler.stages; import java.util.List; import java.util.ListIterator; import com.github.sommeri.less4j.core.ast.Body; import com.github.sommeri.less4j.core.ast.Declaration; import com.github.sommeri.less4j.core.ast.Expression; import com.github.sommeri.less4j.core.ast.KeywordExpression; import com.github.sommeri.less4j.core.ast.ListExpression; import com.github.sommeri.less4j.core.compiler.expressions.ExpressionManipulator; import com.github.sommeri.less4j.utils.ArraysUtils; /** * Preconditions: * 1.) properties names must be interpolated, * 2.) rulesets bodies must be fully solved. * 3.) properties were merged * */ public class UselessImportantRemover extends TreeDeclarationsVisitor { private ExpressionManipulator expressionManipulator = new ExpressionManipulator(); public UselessImportantRemover() { } protected void applyToDeclaration(Declaration declaration) { Expression expression = declaration.getExpression(); if (!expressionManipulator.isImportant(expression)) return ; expressionManipulator.squashLists(expression); ListExpression list = expressionManipulator.findRightmostSpaceSeparatedList(expression); if (list==null) return ; List<Expression> expressions = list.getExpressions(); if (!isImportant(ArraysUtils.last(expressions))) return ; ListIterator<Expression> iterator = expressions.listIterator(expressions.size()); int countImportant = 0; while (iterator.hasPrevious()) { if (isImportant(iterator.previous())) countImportant++; } if (countImportant<=1) return ; int removalIndex = expressions.size()-countImportant; for (int i=countImportant-1; i>0;i--) { list.removeExpression(removalIndex); } } private boolean isImportant(Expression last) { if (last==null || !(last instanceof KeywordExpression)) return false; return ((KeywordExpression) last).isImportant(); } protected void enteringBody(Body node) { } protected void leavingBody(Body node) { } }