package com.github.sommeri.less4j.core.ast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 MixinReference extends ASTCssNode {
private List<ReusableStructureName> nameChain = new ArrayList<ReusableStructureName>();
private ReusableStructureName finalName;
private List<Expression> positionalParameters = new ArrayList<Expression>();
private Map<String, Expression> namedParameters = new HashMap<String, Expression>();
private boolean important = false;
public MixinReference(HiddenTokenAwareTree token) {
super(token);
}
public ReusableStructureName getFinalName() {
return finalName;
}
public String getFinalNameAsString() {
return getFinalName().asString();
}
public void setFinalName(ReusableStructureName name) {
this.finalName = name;
}
public List<ReusableStructureName> getNameChain() {
return nameChain;
}
public boolean hasInterpolatedNameChain() {
for (ReusableStructureName name : nameChain) {
if (name.isInterpolated())
return true;
}
return false;
}
public List<String> getNameChainAsStrings() {
List<String> result = new ArrayList<String>();
for (ReusableStructureName name : nameChain) {
result.add(name.asString());
}
return result;
}
public void setNameChain(List<ReusableStructureName> nameChain) {
this.nameChain = nameChain;
}
public List<Expression> getPositionalParameters() {
return positionalParameters;
}
public boolean hasNamedParameter(Variable variable) {
return namedParameters.containsKey(variable.getName());
}
public Expression getNamedParameter(Variable variable) {
return namedParameters.get(variable.getName());
}
public void addName(ReusableStructureName text) {
nameChain.add(text);
}
public void addNames(List<ReusableStructureName> nameChain) {
this.nameChain.addAll(nameChain);
}
public void addPositionalParameter(Expression parameter) {
this.positionalParameters.add(parameter);
}
public void addNamedParameter(VariableDeclaration parameter) {
//FIXME: this is wrong way of doing it, if the value changes later on, the map is NOT updated
this.namedParameters.put(parameter.getVariable().getName(), parameter.getValue());
}
public boolean isImportant() {
return important;
}
public void setImportant(boolean important) {
this.important = important;
}
public boolean hasInterpolatedFinalName() {
return finalName.isInterpolated();
}
@Override
@NotAstProperty
public List<? extends ASTCssNode> getChilds() {
List<ASTCssNode> result = ArraysUtils.asNonNullList((ASTCssNode)finalName);
result.addAll(nameChain);
result.addAll(positionalParameters);
result.addAll(namedParameters.values());
return result;
}
@Override
public ASTCssNodeType getType() {
return ASTCssNodeType.MIXIN_REFERENCE;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder("MixinReference[");
for (ReusableStructureName str : nameChain) {
builder.append(str.asString()).append(" > ");
}
builder.append(getFinalName()).append("]");
return builder.toString();
}
@Override
public MixinReference clone() {
MixinReference result = (MixinReference) super.clone();
result.nameChain = nameChain == null ? null : new ArrayList<ReusableStructureName>(nameChain);
result.finalName = finalName==null?null:finalName.clone();
result.positionalParameters = ArraysUtils.deeplyClonedList(positionalParameters);
result.namedParameters = ArraysUtils.deeplyClonedMap(namedParameters);
result.configureParentToAllChilds();
return result;
}
public Map<String, Expression> getNamedParameters() {
return namedParameters;
}
}