package com.github.sommeri.less4j.core.ast; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.github.sommeri.less4j.core.ast.ListExpressionOperator.Operator; import com.github.sommeri.less4j.core.ast.annotations.NotAstProperty; import com.github.sommeri.less4j.core.compiler.scopes.IScope; import com.github.sommeri.less4j.core.parser.HiddenTokenAwareTree; import com.github.sommeri.less4j.utils.ArraysUtils; public class ListExpression extends Expression { private List<Expression> expressions; private ListExpressionOperator operator; public ListExpression(HiddenTokenAwareTree token, List<Expression> expressions, ListExpressionOperator operator) { super(token); this.expressions = expressions; this.operator = operator; } public ListExpression(HiddenTokenAwareTree token, List<Expression> expressions, ListExpressionOperator operator, IScope scope) { this(token, expressions, operator); setScope(scope); } public ListExpressionOperator getOperator() { return operator; } public void setOperator(ListExpressionOperator operator) { this.operator = operator; } public List<Expression> getExpressions() { return expressions; } public void addExpression(Expression expression) { expressions.add(expression); } public void addExpression(Expression expression, int position) { expressions.add(position>=0 ? position : expressions.size() + position, expression); } public void removeExpression(Expression expression) { expressions.remove(expression); } public void removeExpression(int removalIndex) { expressions.remove(removalIndex); } @Override public ASTCssNodeType getType() { return ASTCssNodeType.LIST_EXPRESSION; } @Override public List<Expression> splitByComma() { if (operator.getOperator()!=Operator.COMMA) return super.splitByComma(); return new ArrayList<Expression>(getExpressions()); } @Override @NotAstProperty public List<? extends ASTCssNode> getChilds() { List<ASTCssNode> result = ArraysUtils.asNonNullList((ASTCssNode)operator); result.addAll(expressions); return result; } @Override public String toString() { StringBuilder builder = new StringBuilder("["); Iterator<Expression> iterator = expressions.iterator(); if (iterator.hasNext()) builder.append(iterator.next()); while (iterator.hasNext()) { builder.append(operator.getOperator()).append(iterator.next()); } builder.append("]"); return builder.toString(); } @Override public ListExpression clone() { ListExpression clone = (ListExpression) super.clone(); clone.expressions = ArraysUtils.deeplyClonedList(expressions); clone.operator = operator.clone(); clone.configureParentToAllChilds(); return clone; } }