/** * Copyright (c) 2012 Cloudsmith Inc. and other contributors, as listed below. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Cloudsmith * */ package org.cloudsmith.xtext.textflow; import java.util.List; import org.cloudsmith.xtext.dommodel.formatter.context.IFormattingContext; import com.google.common.collect.Lists; import com.google.inject.Inject; /** * An implementation of ITextFlow that records and measures the appended content. * */ public class TextFlowWithDebugRecording extends TextFlow { private static class BreakCount implements TextBite { int count; boolean verbatim; BreakCount(int count, boolean verbatim) { this.count = count; this.verbatim = verbatim; } public void visit(StringBuilder stream) { stream.append("Break(").append(count).append(", ").append(verbatim).append(")\n"); } } private static class ChangeIndentation implements TextBite { int change; ChangeIndentation(int change) { this.change = change; } public void visit(StringBuilder stream) { stream.append("ChangeIndentation(").append(change).append(")\n"); } } private static class Indentation implements TextBite { int count; Indentation(int count) { this.count = count; } public void visit(StringBuilder stream) { stream.append("Indent(").append(count).append(")\n"); } } private static class SpaceCount implements TextBite { int count; SpaceCount(int count) { this.count = count; } public void visit(StringBuilder stream) { stream.append("Spaces(").append(count).append(")\n"); } } private static class Text implements TextBite { CharSequence text; boolean verbatim; Text(CharSequence s, boolean verbatim) { this.text = s; this.verbatim = verbatim; } public void visit(StringBuilder stream) { stream.append("Text('").append(text).append("', ").append(verbatim).append(")\n"); } } private interface TextBite { public void visit(StringBuilder stream); } private List<TextBite> tape = Lists.newArrayList(); @Inject public TextFlowWithDebugRecording(IFormattingContext formattingContext) { super(formattingContext); } @Override public ITextFlow appendBreaks(int count, boolean verbatim) { tape.add(new BreakCount(count, verbatim)); return super.appendBreaks(count, verbatim); } @Override public ITextFlow appendSpaces(int count) { tape.add(new SpaceCount(count)); return super.appendSpaces(count); } public void appendTo(StringBuilder output) { for(TextBite tb : tape) tb.visit(output); } @Override public ITextFlow changeIndentation(int count) { if(count == 0) return this; tape.add(new ChangeIndentation(count)); return super.changeIndentation(count); } @Override protected void doText(CharSequence s, boolean verbatim) { tape.add(new Text(s, verbatim)); super.doText(s, verbatim); } @Override public ITextFlow setIndentation(int count) { tape.add(new Indentation(count)); return super.setIndentation(count); } }