package com.mobilesorcery.sdk.html5.debug.rewrite; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.eclipse.wst.jsdt.core.dom.ASTNode; import com.mobilesorcery.sdk.core.Util; import com.mobilesorcery.sdk.html5.debug.Position; public class SourceRewrite implements IRewrite { private int currentPosition; private String source; private final TreeMap<Integer, List<String>> insertions = new TreeMap<Integer, List<String>>(); private int offset; public SourceRewrite(String source) { this(source, null); } public SourceRewrite(String source, ASTNode node) { offset = node == null ? 0 : node.getStartPosition(); int length = node == null ? source.length() : node.getLength(); this.source = source.substring(offset, offset + length); } @Override public void seek(Position position) { seek(position.getPosition()); } @Override public void seek(int position) { this.currentPosition = position; } public int skip(int delta) { this.currentPosition += delta; return currentPosition; } @Override public void insert(String insertion) { List<String> insertionsForPosition = insertions.get(currentPosition); if (insertionsForPosition == null) { insertionsForPosition = new ArrayList<String>(); insertions.put(currentPosition, insertionsForPosition); } insertionsForPosition.add(insertion); } public String rewrite() { StringBuffer result = new StringBuffer(); int prevPos = offset; int posDelta = 0; for (Map.Entry<Integer, List<String>> insertion : insertions .entrySet()) { Integer pos = insertion.getKey(); List<String> insertionsAtPos = insertion.getValue(); result.append(source.substring(prevPos - offset, pos - offset)); String insertionStr = Util.join(insertionsAtPos.toArray(), ""); result.append(insertionStr); prevPos = pos; posDelta += insertionStr.length(); //movedSourceMap.put(prevPos, posDelta); } result.append(source.substring(prevPos - offset)); return result.toString(); } }