package jetbrains.mps.smodel.persistence.def; /*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; } }