package coloredide.configuration; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.Stack; import org.eclipse.jdt.core.dom.IASTNode; import org.eclipse.jdt.core.dom.ASTVisitor; import coloredide.features.Feature; import coloredide.features.source.CompilationUnitColorManager; public class CodeSegmentCalculator { protected static final Set NOCOLORS = new HashSet<Feature>(); public static List<CodeSegment> getCodeSegments(IASTNode ast, final CompilationUnitColorManager colorManager) { final Stack<CodeSegment> stack = new Stack<CodeSegment>(); final List<CodeSegment> list = new ArrayList<CodeSegment>(); stack.push(new CodeSegment(ast.getStartPosition(), ast .getStartPosition() + ast.getLength(), NOCOLORS)); ASTVisitor visitor = new ASTVisitor() { private IASTNode last; public void preVisit(IASTNode node) { IASTNode next = node; node = last; last = next; if (node == null) return; while (stack.peek().endPosition() < node.getStartPosition()) list.add(stack.pop()); Set<Feature> colors = colorManager.getColors(node); if (stack.peek().colors.equals(colors)) { // colors did not change, ignore // stack.peek().containingNodes.add(node); } else { CodeSegment old = stack.pop(); // finished previous segment list.add(new CodeSegment(old.getOffset(), node .getStartPosition(), old.colors/*, old.containingNodes*/)); stack.push(new CodeSegment(node.getStartPosition() + node.getLength(), old.endPosition(), old.colors/*, old.containingNodes*/)); stack.push(new CodeSegment(node.getStartPosition(), node .getStartPosition() + node.getLength(), colors/*, old.containingNodes*/)); // stack.peek().containingNodes.add(node); } super.preVisit(node); } }; ast.accept(visitor); while (!stack.isEmpty()) list.add(stack.pop()); removeEmptySegments(list); return list; } private static void removeEmptySegments(List<CodeSegment> list) { Iterator<CodeSegment> i = list.iterator(); while (i.hasNext()) { CodeSegment seg = i.next(); if (seg.isEmpty()) { i.remove(); } } } }