package com.github.sommeri.less4j.core.compiler.scopes.local;
import java.util.ArrayList;
import java.util.List;
import com.github.sommeri.less4j.core.ast.ReusableStructureName;
import com.github.sommeri.less4j.core.compiler.scopes.FullMixinDefinition;
import com.github.sommeri.less4j.core.compiler.scopes.local.KeyListStorage.ListPlaceholder;
public class MixinsDefinitionsStorage implements Cloneable {
private KeyListStorage<String, FullMixinDefinition> coolStorage = new KeyListStorage<String, FullMixinDefinition>();
public MixinsDefinitionsStorage() {
}
public void store(FullMixinDefinition mixin) {
List<ReusableStructureName> names = mixin.getMixin().getNames();
for (ReusableStructureName name : names) {
coolStorage.add(name.asString(), mixin);
}
}
public void store(String name, List<FullMixinDefinition> value) {
coolStorage.add(name, value);
}
public void storeAll(List<FullMixinDefinition> mixins) {
for (FullMixinDefinition mixin : mixins) {
store(mixin);
}
}
public void storeAll(MixinsDefinitionsStorage otherStorage) {
coolStorage.add(otherStorage.coolStorage);
}
public List<FullMixinDefinition> getMixins(List<String> nameChain, ReusableStructureName name) {
return getMixins(toMixinName(nameChain, name));
}
private String toMixinName(List<String> nameChain, ReusableStructureName name) {
StringBuilder result = new StringBuilder();
for (String str : nameChain) {
result.append(str);
}
result.append(name.asString());
return result.toString();
}
public List<FullMixinDefinition> getMixins(ReusableStructureName name) {
return getMixins(name.asString());
}
public List<FullMixinDefinition> getMixins(String name) {
List<FullMixinDefinition> mixins = coolStorage.getValues(name);
return mixins != null ? mixins : new ArrayList<FullMixinDefinition>();
}
public List<FullMixinDefinition> getAllMixins() {
return coolStorage.getAllValues();
}
public void addToPlaceholder(MixinsDefinitionsStorage otherStorage) {
coolStorage.addDataToFirstPlaceholder(otherStorage.coolStorage);
}
public void replacePlaceholder(MixinsPlaceholder mixinsPlaceholder, MixinsDefinitionsStorage otherStorage) {
coolStorage.replacePlaceholder(mixinsPlaceholder.coolPlaceholder, otherStorage.coolStorage);
}
public void addAll(MixinsDefinitionsStorage source) {
coolStorage.add(source.coolStorage);
}
public MixinsPlaceholder createPlaceholder() {
ListPlaceholder<String, FullMixinDefinition> coolPlaceholder = coolStorage.createPlaceholder();
return new MixinsPlaceholder(coolPlaceholder);
}
public void closePlaceholder() {
coolStorage.closeFirstPlaceholder();
}
public int size() {
return coolStorage.getAllValues().size();
}
public MixinsDefinitionsStorage clone() {
try {
MixinsDefinitionsStorage clone = (MixinsDefinitionsStorage) super.clone();
clone.coolStorage = coolStorage.clone();
return clone;
} catch (CloneNotSupportedException e) {
throw new IllegalStateException("Impossible state.");
}
}
@Override
public String toString() {
return coolStorage.toString();
}
public static class MixinsPlaceholder {
private final ListPlaceholder<String, FullMixinDefinition> coolPlaceholder;
public MixinsPlaceholder(ListPlaceholder<String, FullMixinDefinition> coolPlaceholder) {
this.coolPlaceholder = coolPlaceholder;
}
}
}