package com.github.sommeri.less4j.core.ast; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.github.sommeri.less4j.core.ast.annotations.NotAstProperty; import com.github.sommeri.less4j.core.parser.HiddenTokenAwareTree; import com.github.sommeri.less4j.utils.ArraysUtils; public class InterpolableName extends ASTCssNode { private List<InterpolableNamePart> parts = new ArrayList<InterpolableNamePart>(); public InterpolableName(HiddenTokenAwareTree underlyingStructure) { super(underlyingStructure); } public InterpolableName(HiddenTokenAwareTree underlyingStructure, InterpolableNamePart... fixedNameParts) { super(underlyingStructure); add(fixedNameParts); } public boolean isInterpolated() { if (parts==null) return false; for (InterpolableNamePart part : parts) { if (part.getType() == ASTCssNodeType.VARIABLE_NAME_PART) return true; } return false; } public String getName() { String result = ""; for (InterpolableNamePart part : parts) { result+=part.getName(); } return result; } public void add(InterpolableNamePart part) { parts.add(part); } public void add(InterpolableNamePart... parts) { this.parts.addAll(Arrays.asList(parts)); configureParentToAllChilds(); } public List<InterpolableNamePart> getParts() { return parts; } public void replaceMember(InterpolableNamePart oldMember, InterpolableNamePart newMember) { parts.add(parts.indexOf(oldMember), newMember); newMember.setParent(this); parts.remove(oldMember); oldMember.setParent(null); } @Override @NotAstProperty public List<? extends ASTCssNode> getChilds() { return parts; } @Override public ASTCssNodeType getType() { return ASTCssNodeType.INTERPOLABLE_NAME; } public InterpolableName clone() { InterpolableName clone = (InterpolableName) super.clone(); clone.parts = ArraysUtils.deeplyClonedList(getParts()); clone.configureParentToAllChilds(); return clone; } public void extendName(String extension) { //it would be cleaner to extend with a list of name parts (maybe) parts.add(new FixedNamePart(getUnderlyingStructure(), extension)); } @Override public String toString() { StringBuilder builder = new StringBuilder(); for (InterpolableNamePart part : getParts()) { builder.append(part); } return builder.toString(); } }