| Index: editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/analysis/CacheWriter.java | 
| =================================================================== | 
| --- editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/analysis/CacheWriter.java	(revision 0) | 
| +++ editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/analysis/CacheWriter.java	(revision 0) | 
| @@ -0,0 +1,94 @@ | 
| +package com.google.dart.tools.core.analysis; | 
| + | 
| +import java.io.File; | 
| +import java.io.PrintWriter; | 
| +import java.io.Writer; | 
| +import java.util.ArrayList; | 
| +import java.util.Map; | 
| +import java.util.Map.Entry; | 
| +import java.util.Set; | 
| + | 
| +/** | 
| + * Internal class for writing analysis state to disk between sessions. | 
| + */ | 
| +public class CacheWriter { | 
| +  private PrintWriter writer; | 
| + | 
| +  public CacheWriter(Writer writer) { | 
| +    this.writer = writer instanceof PrintWriter ? (PrintWriter) writer : new PrintWriter(writer); | 
| +    this.writer.println(CacheReader.CACHE_VERSION_TAG); | 
| +  } | 
| + | 
| +  /** | 
| +   * Write a value that can be read by {@link CacheReader#readBoolean()} | 
| +   */ | 
| +  public void writeBoolean(boolean value) { | 
| +    writer.println(value ? "true" : "false"); | 
| +  } | 
| + | 
| +  /** | 
| +   * Write a collection of file paths to be read by | 
| +   * {@link CacheReader#readFilePaths(java.util.Collection, String)} | 
| +   * | 
| +   * @param files the collection of files (not <code>null</code> ) | 
| +   * @param endTag the tag used to denote the end of the collection of file paths | 
| +   */ | 
| +  public void writeFilePaths(ArrayList<File> files, String endTag) { | 
| +    for (File libFile : files) { | 
| +      writeString(libFile.getPath()); | 
| +    } | 
| +    writeString(endTag); | 
| +  } | 
| + | 
| +  /** | 
| +   * Write a string that can be read by {@link CacheReader#readString()} | 
| +   */ | 
| +  public void writeString(String string) { | 
| + | 
| +    // Normal case ... write a line | 
| + | 
| +    if (!string.startsWith("!") && string.indexOf('\r') == -1 && string.indexOf('\n') == -1) { | 
| +      writer.println(string); | 
| +      return; | 
| +    } | 
| + | 
| +    // If the string contains a line separator, then string length is encoded | 
| +    // preceding the string as bang-number-bang | 
| + | 
| +    writer.print('!'); | 
| +    writer.print(string.length()); | 
| +    writer.print('!'); | 
| +    writer.println(string); | 
| +  } | 
| + | 
| +  /** | 
| +   * Write a collection of key/value pairs to be read by | 
| +   * {@link CacheReader#readStringFileMap(String)} where the keys are strings and the values are | 
| +   * instances of {@link java.io.File}. | 
| +   * | 
| +   * @param endTag the tag used to denote the end of the collection | 
| +   * @return the collection (not <code>null</code>) | 
| +   */ | 
| +  public void writeStringFileMap(Map<String, File> map, String endTag) { | 
| +    for (Entry<String, File> entry : map.entrySet()) { | 
| +      writeString(entry.getKey()); | 
| +      writeString(entry.getValue().getPath()); | 
| +    } | 
| +    writeString(endTag); | 
| +  } | 
| + | 
| +  /** | 
| +   * Write a collection of strings that can be read by {@link CacheReader#readStringSet(String)} | 
| +   * | 
| +   * @param strings the collection of strings to be written (not <code>null</code>, contains no | 
| +   *          <code>null</code>s) | 
| +   * @param endTag the tag used to denote the end of the collection of strings (not | 
| +   *          <code>null</code>) | 
| +   */ | 
| +  public void writeStringSet(Set<String> strings, String endTag) { | 
| +    for (String string : strings) { | 
| +      writeString(string); | 
| +    } | 
| +    writeString(endTag); | 
| +  } | 
| +} | 
|  |