package jetbrains.mps.smodel.persistence.def.v5;
/*Generated by MPS */
import java.util.List;
import jetbrains.mps.smodel.persistence.lines.LineContent;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import java.util.Deque;
import org.jetbrains.mps.openapi.model.SNodeId;
import jetbrains.mps.internal.collections.runtime.DequeSequence;
import java.util.LinkedList;
import org.xml.sax.Locator;
import jetbrains.mps.smodel.persistence.lines.NodeLineContent;
import jetbrains.mps.smodel.persistence.lines.PropertyLineContent;
import jetbrains.mps.smodel.persistence.lines.ReferenceLineContent;
public class LineContentAccumulator {
private List<LineContent> myLineToContentMap = ListSequence.fromList(new ArrayList<LineContent>());
private Deque<SNodeId> myNodeIdStack = DequeSequence.fromDequeNew(new LinkedList<SNodeId>());
public LineContentAccumulator() {
}
public void pushNode(SNodeId nodeId, Locator locator) {
DequeSequence.fromDequeNew(myNodeIdStack).pushElement(nodeId);
saveNode(locator);
}
public void popNode(Locator locator) {
saveNode(locator);
DequeSequence.fromDequeNew(myNodeIdStack).popElement();
}
private void saveElement(int index, LineContent lineContent) {
while (index >= ListSequence.fromList(myLineToContentMap).count()) {
ListSequence.fromList(myLineToContentMap).addElement(null);
}
ListSequence.fromList(myLineToContentMap).setElement(index, lineContent);
}
private void saveElement(Locator locator, LineContent lineContent) {
saveElement(locator.getLineNumber() - 1, lineContent);
}
private void saveNode(Locator locator) {
saveElement(locator, new NodeLineContent(DequeSequence.fromDequeNew(myNodeIdStack).peekElement()));
}
public void saveProperty(String name, Locator locator) {
saveElement(locator, new PropertyLineContent(DequeSequence.fromDequeNew(myNodeIdStack).peekElement(), name));
}
public void saveReference(String role, Locator locator) {
saveElement(locator, new ReferenceLineContent(DequeSequence.fromDequeNew(myNodeIdStack).peekElement(), role));
}
public void processText(String text, Locator locator) {
LineContent lineContent = null;
if (DequeSequence.fromDequeNew(myNodeIdStack).isNotEmpty()) {
lineContent = new NodeLineContent(DequeSequence.fromDequeNew(myNodeIdStack).peekElement());
}
while (locator.getLineNumber() - 1 > ListSequence.fromList(myLineToContentMap).count()) {
ListSequence.fromList(myLineToContentMap).addElement(lineContent);
}
}
public List<LineContent> getLineToContentMap() {
return myLineToContentMap;
}
}