1 19 20 package edu.umd.cs.findbugs.tools.patcomp; 21 22 import java.io.IOException ; 23 import java.io.PrintStream ; 24 import java.util.Arrays ; 25 import java.util.HashSet ; 26 27 public class PrettyCodeEmitter implements CodeEmitter { 28 private PrintStream out; 29 private int indent; 30 private String last = ""; 31 private boolean newline; 32 33 private static final HashSet <String > noSpaceBefore = new HashSet <String >(); 34 private static final HashSet <String > noSpaceAfter = new HashSet <String >(); 35 private static final HashSet <String > alwaysSpaceBeforeAndAfter = new HashSet <String >(); 36 static { 37 String [] both = new String []{ ".", "(", ")", "[", "]"}; 38 String [] before = new String []{ ",", ";" }; 39 noSpaceAfter.addAll(Arrays.asList(both)); 40 noSpaceBefore.addAll(Arrays.asList(both)); 41 noSpaceBefore.addAll(Arrays.asList(before)); 42 43 String [] always = new String []{ "||","&&","=","?",":" }; 44 alwaysSpaceBeforeAndAfter.addAll(Arrays.asList(always)); 45 } 46 47 public PrettyCodeEmitter(PrintStream out) { 48 this.out = out; 49 this.indent = 0; 50 this.newline = true; 51 } 52 53 public void emitToken(String token) { 54 if (token.equals("}")) { 55 newline = true; 56 --indent; 57 } 58 59 if (newline) { 60 out.println(); 61 indent(); 62 newline = false; 63 } else if (alwaysSpaceBeforeAndAfter.contains(last) || alwaysSpaceBeforeAndAfter.contains(token) || 64 !(noSpaceAfter.contains(last) || noSpaceBefore.contains(token))) 65 out.print(" "); 66 67 out.print(token); 68 69 if (token.equals(";") || token.equals("}")) 70 newline = true; 71 else if (token.equals("{")) { 72 newline = true; 73 ++indent; 74 } 75 76 last = token; 77 } 78 79 public void finish() throws IOException { 80 out.println(); 81 out.flush(); 82 } 83 84 private void indent() { 85 for (int i = 0; i < indent; ++i) 86 out.print("\t"); 87 } 88 } 89 90 | Popular Tags |