This patch moves SOYC's source code underneath dev/core/src.  It leaves
gwt-soyc-vis.jar existing and containing the SOYC static resources (css and
gifs).  It has gwt-dev-platform.jar also contain the SOYC static resources.

After this patch, any existing build rules and scripts should be able
to replace references to gwt-soyc-vis.jar by references to gwt-dev-platform.jar.

Review by: fabbott


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5993 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/common.ant.xml b/dev/common.ant.xml
index ef64c7a..10d9500 100755
--- a/dev/common.ant.xml
+++ b/dev/common.ant.xml
@@ -4,6 +4,7 @@
 
   <property.ensure name="gwt.core.root" location="../core" />
   <property.ensure name="gwt.core.build" location="${project.build}/../core" />
+  <property.ensure name="gwt.tools.soyc" location="${gwt.root}/tools/soyc-vis" />
 
   <target name="compile" description="Compile all java files">
     <mkdir dir="${javac.out}" />
@@ -30,6 +31,9 @@
         <fileset dir="${gwt.core.build}/bin" />
         <fileset file="${gwt.tools.lib}/eclipse/${gwt.dev.swt.jar}" />
         <fileset file="${gwt.core.build}/alldeps.jar" />
+        <fileset dir="${gwt.tools.soyc}/images"/>
+        <fileset file="${gwt.tools.soyc}/classLevel.css"/>
+        <fileset file="${gwt.tools.soyc}/roundedCorners.css"/>
       </sourcefiles>
       <targetfiles>
         <fileset file="${project.lib}"/>
@@ -46,6 +50,11 @@
           <fileset dir="${gwt.core.build}/bin" />
           <zipfileset src="${gwt.tools.lib}/eclipse/${gwt.dev.swt.jar}" />
           <zipfileset src="${gwt.core.build}/alldeps.jar" />
+
+          <zipfileset dir="${gwt.tools.soyc}/images" prefix="com/google/gwt/soyc/resources/images"/>
+          <zipfileset file="${gwt.tools.soyc}/classLevel.css" prefix="com/google/gwt/soyc/resources/"/>
+          <zipfileset file="${gwt.tools.soyc}/roundedCorners.css" prefix="com/google/gwt/soyc/resources/"/>
+
           <manifest>
             <attribute name="Main-Class" value="com.google.gwt.dev.GWTMain" />
           </manifest>
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/CodeCollection.java b/dev/core/src/com/google/gwt/soyc/CodeCollection.java
similarity index 100%
rename from tools/soyc-vis/src/com/google/gwt/soyc/CodeCollection.java
rename to dev/core/src/com/google/gwt/soyc/CodeCollection.java
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/GlobalInformation.java b/dev/core/src/com/google/gwt/soyc/GlobalInformation.java
similarity index 97%
rename from tools/soyc-vis/src/com/google/gwt/soyc/GlobalInformation.java
rename to dev/core/src/com/google/gwt/soyc/GlobalInformation.java
index 13f2646..aaf9edf 100644
--- a/tools/soyc-vis/src/com/google/gwt/soyc/GlobalInformation.java
+++ b/dev/core/src/com/google/gwt/soyc/GlobalInformation.java
@@ -28,9 +28,9 @@
  * Information global to the entire SOYC report generator.
  */
 public class GlobalInformation {
+  private static final SizeBreakdown[] EMPTY_SIZE_BREAKDOWN = new SizeBreakdown[0];
   private HashMap<String, String> classToPackage = new HashMap<String, String>();
   private HashMap<String, HashSet<String>> classToWhatItDependsOn = new HashMap<String, HashSet<String>>();
-  private final SizeBreakdown[] EMPTY_SIZE_BREAKDOWN = new SizeBreakdown[0];
   private Map<Integer, SizeBreakdown> exclusiveCodeBreakdowns = new HashMap<Integer, SizeBreakdown>();
   private SizeBreakdown initialCodeBreakdown = new SizeBreakdown(
       "Initially downloaded code", "initial");
@@ -38,11 +38,11 @@
       "Leftovers code, code not in any other category", "leftovers");
   private int numSplitPoints = 0;
   private Map<String, TreeSet<String>> packageToClasses = new TreeMap<String, TreeSet<String>>();
-  private HashMap<Integer, String> splitPointToLocation = new HashMap<Integer, String>();
   private ArrayList<Integer> splitPointInitialLoadSequence = new ArrayList<Integer>();
+  private HashMap<Integer, String> splitPointToLocation = new HashMap<Integer, String>();
   private SizeBreakdown totalCodeBreakdown = new SizeBreakdown("Total program",
       "total");
-  
+
   public SizeBreakdown[] allSizeBreakdowns() {
     List<SizeBreakdown> breakdowns = new ArrayList<SizeBreakdown>();
     breakdowns.add(totalCodeBreakdown);
@@ -55,7 +55,7 @@
     }
     return breakdowns.toArray(EMPTY_SIZE_BREAKDOWN);
   }
-  
+
   /**
    * Computes all package sizes.
    */
@@ -66,28 +66,6 @@
   }
 
   /**
-   * Computes package sizes from class sizes. TODO(spoon) move this to the
-   * SizeBreakdown class.
-   * 
-   * @param packageToSize mapping from packages to their sizes
-   * @param classToSize mapping from classes to their sizes
-   */
-  private void computePackageSizes(Map<String, Integer> packageToSize,
-      Map<String, Integer> classToSize) {
-    packageToSize.clear();
-    for (String packageName : packageToClasses.keySet()) {
-      packageToSize.put(packageName, 0);
-      for (String className : packageToClasses.get(packageName)) {
-        if (classToSize.containsKey(className)) {
-          int curSize = classToSize.get(className);
-          int newSize = curSize + packageToSize.get(packageName);
-          packageToSize.put(packageName, newSize);
-        }
-      }
-    }
-  }
-  
-  /**
    * Gets the mapping from each class to its package.
    * 
    * @return classToPackage
@@ -113,7 +91,7 @@
   public final Map<Integer, SizeBreakdown> getExclusiveCodeBreakdowns() {
     return exclusiveCodeBreakdowns;
   }
-  
+
   /**
    * Gets the initial code breakdown.
    * 
@@ -131,7 +109,7 @@
   public final SizeBreakdown getLeftoversBreakdown() {
     return leftoversBreakdown;
   }
-  
+
   /**
    * Gets the number of split points.
    * 
@@ -149,7 +127,7 @@
   public final Map<String, TreeSet<String>> getPackageToClasses() {
     return packageToClasses;
   }
-  
+
   /**
    * Gets the initial load sequence.
    * 
@@ -167,7 +145,7 @@
   public final HashMap<Integer, String> getSplitPointToLocation() {
     return splitPointToLocation;
   }
-  
+
   /**
    * Gets the total code breakdown.
    * 
@@ -176,7 +154,7 @@
   public final SizeBreakdown getTotalCodeBreakdown() {
     return totalCodeBreakdown;
   }
-  
+
   /**
    * Increments the split point count.
    */
@@ -199,4 +177,26 @@
     return exclusiveCodeBreakdowns.get(sp);
   }
 
+  /**
+   * Computes package sizes from class sizes. TODO(spoon) move this to the
+   * SizeBreakdown class.
+   * 
+   * @param packageToSize mapping from packages to their sizes
+   * @param classToSize mapping from classes to their sizes
+   */
+  private void computePackageSizes(Map<String, Integer> packageToSize,
+      Map<String, Integer> classToSize) {
+    packageToSize.clear();
+    for (String packageName : packageToClasses.keySet()) {
+      packageToSize.put(packageName, 0);
+      for (String className : packageToClasses.get(packageName)) {
+        if (classToSize.containsKey(className)) {
+          int curSize = classToSize.get(className);
+          int newSize = curSize + packageToSize.get(packageName);
+          packageToSize.put(packageName, newSize);
+        }
+      }
+    }
+  }
+
 }
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/LiteralsCollection.java b/dev/core/src/com/google/gwt/soyc/LiteralsCollection.java
similarity index 100%
rename from tools/soyc-vis/src/com/google/gwt/soyc/LiteralsCollection.java
rename to dev/core/src/com/google/gwt/soyc/LiteralsCollection.java
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java b/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
similarity index 98%
rename from tools/soyc-vis/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
rename to dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
index 7c5c5fe..4ff9124 100644
--- a/tools/soyc-vis/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
+++ b/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
@@ -43,12 +43,19 @@
  * A utility to make the top level HTTML file for one permutation.
  */
 public class MakeTopLevelHtmlForPerm {
+  /**
+   * A dependency linker for exclusive fragments. It links to nothing.
+   */
   public class DependencyLinkerForExclusiveFragment implements DependencyLinker {
     public String dependencyLinkForClass(String className, String permutationId) {
       return null;
     }
   }
 
+  /**
+   * A dependency linker for the initial code download. It links to the
+   * dependencies for the initial download.
+   */
   public class DependencyLinkerForInitialCode implements DependencyLinker {
     public String dependencyLinkForClass(String className, String permutationId) {
       String packageName = globalInformation.getClassToPackage().get(className);
@@ -58,12 +65,21 @@
     }
   }
 
+  /**
+   * A dependency linker for the leftovers fragment. It links to leftovers
+   * status pages.
+   */
   public class DependencyLinkerForLeftoversFragment implements DependencyLinker {
     public String dependencyLinkForClass(String className, String permutationId) {
       return leftoversStatusFileName(className, permutationId);
     }
   }
 
+  /**
+   * A dependency linker for the total program breakdown. It links to a split
+   * status page.
+   * 
+   */
   public class DependencyLinkerForTotalBreakdown implements DependencyLinker {
     public String dependencyLinkForClass(String className, String permutationId) {
       return splitStatusFileName(className, permutationId);
@@ -75,33 +91,6 @@
   }
 
   /**
-   * Default constructor. Will be used for all permutations.
-   */
-  MakeTopLevelHtmlForPerm() {
-    this.globalInformation = new GlobalInformation();
-    this.settings = new Settings();
-  }
-
-  /**
-   * Constructor for a specific permutation.
-   * 
-   * @param globalInformation All the information about this permutation
-   */
-  MakeTopLevelHtmlForPerm(final GlobalInformation globalInformation) {
-    this.globalInformation = globalInformation;
-  }
-
-  /**
-   * Global information for this permutation.
-   */
-  private GlobalInformation globalInformation = new GlobalInformation();
-
-  /**
-   * Settings for this permutation.
-   */
-  private Settings settings = new Settings();
-
-  /**
    * By a convention shared with the compiler, the initial download is fragment
    * number 0.
    */
@@ -125,6 +114,83 @@
       '.', '/')
       + "/resources/";
 
+  public static String escapeXml(String unescaped) {
+    String escaped = unescaped.replaceAll("\\&", "&amp;");
+    escaped = escaped.replaceAll("\\<", "&lt;");
+    escaped = escaped.replaceAll("\\>", "&gt;");
+    escaped = escaped.replaceAll("\\\"", "&quot;");
+    escaped = escaped.replaceAll("\\'", "&apos;");
+    return escaped;
+  }
+
+  private static void addCenteredHeader(final PrintWriter outFile, String header) {
+    outFile.println("<hr>");
+    outFile.println("<b>" + header + "</b>");
+    outFile.println("<hr>");
+  }
+
+  /**
+   * Adds a header line indicating which breakdown is being analyzed.
+   */
+  private static void addHeaderWithBreakdownContext(SizeBreakdown breakdown,
+      final PrintWriter outFile) {
+    addCenteredHeader(outFile, headerLineForBreakdown(breakdown));
+  }
+
+  private static String classesInPackageFileName(SizeBreakdown breakdown,
+      String packageName, String permutationId) {
+    return breakdown.getId() + "_" + packageName + "-" + permutationId
+        + "_Classes.html";
+  }
+
+  /**
+   * Convert a potentially long string into a short file name. The current
+   * implementation simply hashes the long name.
+   */
+  private static String filename(String longFileName) {
+    try {
+      return Util.computeStrongName(longFileName.getBytes(Util.DEFAULT_ENCODING));
+    } catch (UnsupportedEncodingException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  private static String headerLineForBreakdown(SizeBreakdown breakdown) {
+    return "(Analyzing code subset: " + breakdown.getDescription() + ")";
+  }
+
+  private static String shellFileName(SizeBreakdown breakdown,
+      String permutationId) {
+    return breakdown.getId() + "-" + permutationId + "-overallBreakdown.html";
+  }
+
+  /**
+   * Global information for this permutation.
+   */
+  private GlobalInformation globalInformation = new GlobalInformation();
+
+  /**
+   * Settings for this permutation.
+   */
+  private Settings settings = new Settings();
+
+  /**
+   * Default constructor. Will be used for all permutations.
+   */
+  MakeTopLevelHtmlForPerm() {
+    this.globalInformation = new GlobalInformation();
+    this.settings = new Settings();
+  }
+
+  /**
+   * Constructor for a specific permutation.
+   * 
+   * @param globalInformation All the information about this permutation
+   */
+  MakeTopLevelHtmlForPerm(final GlobalInformation globalInformation) {
+    this.globalInformation = globalInformation;
+  }
+
   public void copyFileOrDirectory(File srcPath, File dstPath, String classPath,
       String inputFileName, boolean isDirectory) throws IOException {
     if (srcPath.isDirectory()) {
@@ -193,216 +259,8 @@
     }
   }
 
-  public static String escapeXml(String unescaped) {
-    String escaped = unescaped.replaceAll("\\&", "&amp;");
-    escaped = escaped.replaceAll("\\<", "&lt;");
-    escaped = escaped.replaceAll("\\>", "&gt;");
-    escaped = escaped.replaceAll("\\\"", "&quot;");
-    escaped = escaped.replaceAll("\\'", "&apos;");
-    return escaped;
-  }
-
-  private static void addCenteredHeader(final PrintWriter outFile, String header) {
-    outFile.println("<hr>");
-    outFile.println("<b>" + header + "</b>");
-    outFile.println("<hr>");
-  }
-
-  /**
-   * Adds a header line indicating which breakdown is being analyzed.
-   */
-  private static void addHeaderWithBreakdownContext(SizeBreakdown breakdown,
-      final PrintWriter outFile) {
-    addCenteredHeader(outFile, headerLineForBreakdown(breakdown));
-  }
-
-  private static String classesInPackageFileName(SizeBreakdown breakdown,
-      String packageName, String permutationId) {
-    return breakdown.getId() + "_" + packageName + "-" + permutationId
-        + "_Classes.html";
-  }
-
-  /**
-   * Convert a potentially long string into a short file name. The current
-   * implementation simply hashes the long name.
-   */
-  private static String filename(String longFileName) {
-    try {
-      return Util.computeStrongName(longFileName.getBytes(Util.DEFAULT_ENCODING));
-    } catch (UnsupportedEncodingException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  /**
-   * Return a {@link File} object for a file to be emitted into the output
-   * directory.
-   */
-  private File getOutFile(String localFileName) {
-    File outDir = new File(settings.out.get());
-    return new File(outDir, localFileName);
-  }
-
-  private static String headerLineForBreakdown(SizeBreakdown breakdown) {
-    return "(Analyzing code subset: " + breakdown.getDescription() + ")";
-  }
-
-  /**
-   * Describe the code covered by the dependency graph with the supplied name.
-   */
-  private String inferDepGraphDescription(String depGraphName) {
-    if (depGraphName.equals("initial")) {
-      return "Initially Live Code";
-    }
-
-    if (depGraphName.equals("total")) {
-      return "All Code";
-    }
-
-    Matcher matcher = PATTERN_SP_INT.matcher(depGraphName);
-    if (matcher.matches()) {
-      int splitPoint = Integer.valueOf(matcher.group(1));
-      if (isInitialSplitPoint(splitPoint)) {
-        return "Code Becoming Live at Split Point " + splitPoint;
-      } else {
-        return "Code not Exclusive to Split Point " + splitPoint;
-      }
-    }
-
-    throw new RuntimeException("Unexpected dependency graph name: "
-        + depGraphName);
-  }
-
-  private boolean isInitialSplitPoint(int splitPoint) {
-    return globalInformation.getSplitPointInitialLoadSequence().contains(
-        splitPoint);
-  }
-
-  private String makeCodeTypeHtml(SizeBreakdown breakdown,
-      Map<String, CodeCollection> nameToCodeColl,
-      Map<String, LiteralsCollection> nameToLitColl, String permutationId)
-      throws IOException {
-    String outFileName = breakdown.getId() + "-" + permutationId
-        + "_codeTypeBreakdown.html";
-    float maxSize = 0f;
-    float sumSize = 0f;
-    TreeMap<Float, String> sortedCodeTypes = new TreeMap<Float, String>(
-        Collections.reverseOrder());
-
-    for (String codeType : nameToCodeColl.keySet()) {
-      float curSize = nameToCodeColl.get(codeType).getCumPartialSize(breakdown);
-      sumSize += curSize;
-
-      if (curSize != 0f) {
-        sortedCodeTypes.put(curSize, codeType);
-        if (curSize > maxSize) {
-          maxSize = curSize;
-        }
-      }
-    }
-
-    final PrintWriter outFile = new PrintWriter(getOutFile(outFileName));
-
-    outFile.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
-    outFile.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
-    outFile.println("<html>");
-    outFile.println("<head>");
-    outFile.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
-    outFile.println("<link rel=\"stylesheet\" href=\"common.css\" media=\"screen\">");
-    outFile.println("</head>");
-
-    outFile.println("<body>");
-    outFile.println("<table style='width:100%'>");
-    outFile.println("<thead>");
-    outFile.println("<th class='barlabel'>Size</th>");
-
-    outFile.println("<th class='barlabel'>Percentage</th>");
-    outFile.println("<th class='barlabel'></th>");
-    outFile.println("<th style='width:100%' class='barlabel'></th>");
-    outFile.println("</thead>");
-
-    for (Float size : sortedCodeTypes.keySet()) {
-
-      String codeType = sortedCodeTypes.get(size);
-      String drillDownFileName = breakdown.getId() + "_" + codeType + "-"
-          + permutationId + "Classes.html";
-
-      float ratio = (size / maxSize) * 79;
-      float perc = (size / sumSize) * 100;
-
-      if (ratio < 5) {
-        ratio = 5;
-      }
-
-      outFile.println("<tr>");
-      outFile.println("<td class=\"barlabel\">" + size + "</td>");
-      outFile.println("<td class=\"barlabel\">" + perc + "%</td>");
-      outFile.println("<td class=\"barlabel\"><a href=\"" + drillDownFileName
-          + "\" target=\"_top\">" + codeType + "</a></td>");
-      outFile.println("<td class=\"box\">");
-      outFile.println("<div style=\"width:"
-          + ratio
-          + "%;\" class=\"lb\"><div class=\"rb\"><div class=\"bb\"><div class=\"blc\"><div class=\"brc\"><div class=\"tb\"><div class=\"tlc\"><div class=\"trc\"><div class=\"content\"></div></div></div></div></div></div></div></div>");
-      outFile.println("</td>");
-      outFile.println("</tr>");
-
-    }
-
-    maxSize = 0f;
-    sumSize = 0f;
-    TreeMap<Float, String> sortedLitTypes = new TreeMap<Float, String>(
-        Collections.reverseOrder());
-
-    for (String literal : nameToLitColl.keySet()) {
-      float curSize = nameToLitColl.get(literal).size;
-      sumSize += curSize;
-
-      if (curSize != 0f) {
-        sortedLitTypes.put(curSize, literal);
-
-        if (curSize > maxSize) {
-          maxSize = curSize;
-        }
-      }
-    }
-
-    for (Float size : sortedLitTypes.keySet()) {
-      String literal = sortedLitTypes.get(size);
-      String drillDownFileName = breakdown.getId() + "_" + literal + "-"
-          + permutationId + "Lits.html";
-
-      float ratio = (size / maxSize) * 79;
-      float perc = (size / sumSize) * 100;
-
-      if (ratio < 5) {
-        ratio = 5;
-      }
-
-      outFile.println("<tr>");
-      outFile.println("<td class=\"barlabel\">" + size + "</td>");
-      outFile.println("<td class=\"barlabel\">" + perc + "%</td>");
-      outFile.println("<td class=\"barlabel\"><a href=\"" + drillDownFileName
-          + "\" target=\"_top\">" + literal + "</a></td>");
-      outFile.println("<td class=\"box\">");
-      outFile.println("<div style=\"width:"
-          + ratio
-          + "%;\" class=\"lb\"><div class=\"rb\"><div class=\"bb\"><div class=\"blc\"><div class=\"brc\"><div class=\"tb\"><div class=\"tlc\"><div class=\"trc\"><div class=\"content\"></div></div></div></div></div></div></div></div>");
-      outFile.println("</td>");
-      outFile.println("</tr>");
-
-    }
-
-    outFile.println("</table>");
-    outFile.println("</body>");
-    outFile.println("</html>");
-    outFile.close();
-
-    return outFileName;
-  }
-
-  private static String shellFileName(SizeBreakdown breakdown,
-      String permutationId) {
-    return breakdown.getId() + "-" + permutationId + "-overallBreakdown.html";
+  public GlobalInformation getGlobalInformation() {
+    return globalInformation;
   }
 
   public void makeBreakdownShell(SizeBreakdown breakdown, String permutationId)
@@ -424,19 +282,20 @@
     String inputFileName = "roundedCorners.css";
     File inputFile = new File(classPath + RESOURCES_PATH + inputFileName);
     File outputFile = getOutFile("roundedCorners.css");
-    copyFileOrDirectory(inputFile, outputFile, classPath, RESOURCES_PATH + inputFileName, false);
+    copyFileOrDirectory(inputFile, outputFile, classPath, RESOURCES_PATH
+        + inputFileName, false);
 
     inputFileName = "classLevel.css";
     File inputFile2 = new File(classPath + RESOURCES_PATH + inputFileName);
     File outputFile2 = getOutFile("classLevel.css");
-    copyFileOrDirectory(inputFile2, outputFile2, classPath, RESOURCES_PATH + inputFileName,
-        false);
+    copyFileOrDirectory(inputFile2, outputFile2, classPath, RESOURCES_PATH
+        + inputFileName, false);
 
     inputFileName = "common.css";
     File inputFile3 = new File(classPath + RESOURCES_PATH + inputFileName);
     File outputFile3 = getOutFile("common.css");
-    copyFileOrDirectory(inputFile3, outputFile3, classPath, RESOURCES_PATH + inputFileName,
-        false);
+    copyFileOrDirectory(inputFile3, outputFile3, classPath, RESOURCES_PATH
+        + inputFileName, false);
 
     inputFileName = "images";
     File inputDir = new File(classPath + RESOURCES_PATH + "images");
@@ -855,7 +714,7 @@
       outFile.println("<th class='barlabel'></th>");
       outFile.println("<th style='width:100%' class='barlabel'></th>");
       outFile.println("</thead>");
-
+//
       for (Float size : sortedClasses.keySet()) {
 
         String className = sortedClasses.get(size);
@@ -882,7 +741,6 @@
             + "%;\" class=\"lb\"><div class=\"rb\"><div class=\"bb\"><div class=\"blc\"><div class=\"brc\"><div class=\"tb\"><div class=\"tlc\"><div class=\"trc\"><div class=\"content\"></div></div></div></div></div></div></div></div>");
         outFile.println("</td>");
         outFile.println("</tr>");
-
       }
       outFile.println("</table>");
       outFile.println("</div>");
@@ -897,6 +755,45 @@
     }
   }
 
+  public void makeTopLevelHtmlForAllPerms() throws FileNotFoundException {
+
+    PrintWriter outFile = new PrintWriter(getOutFile("index.html"));
+
+    outFile.println("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">");
+    outFile.println("<html>");
+    outFile.println("<head>");
+    outFile.println("  <title>Story of Your Compile - Top Level Dashboard for all Permutations</title>");
+    outFile.println("<style type=\"text/css\">");
+    outFile.println("body {background-color: #728FCE}");
+    outFile.println("h2 {background-color: transparent}");
+    outFile.println("</style>");
+    outFile.println("</head>");
+
+    outFile.println("<body>");
+    outFile.println("<center>");
+    outFile.println("<h1>Story of Your Compile</h1>");
+    outFile.println("<hr>");
+    outFile.println("<h3>Story of Your Compile - Overview of Permutations</h3>");
+    outFile.println("<hr>");
+
+    outFile.println("<div style='overflow:auto; background-color:white'>");
+    outFile.println("<center>");
+    for (String permutationId : settings.allPermsInfo.keySet()) {
+      String permutationInfo = settings.allPermsInfo.get(permutationId);
+      outFile.print("<p><a href=\"SoycDashboard" + "-" + permutationId
+          + "-index.html\">Permutation " + permutationId);
+      if (permutationInfo.length() > 0) {
+        outFile.println(" (" + permutationInfo + ")" + "</a>");
+      } else {
+        outFile.println("</a>");
+      }
+    }
+    outFile.println("</center>");
+    outFile.println("</div>");
+    addStandardHtmlEnding(outFile);
+    outFile.close();
+  }
+
   public void makeTopLevelShell(String permutationId) throws IOException {
     PrintWriter outFile = new PrintWriter(getOutFile("SoycDashboard" + "-"
         + permutationId + "-index.html"));
@@ -1048,49 +945,12 @@
     outFile.close();
   }
 
-  private void addLefttoversStatus(String className, String packageName,
-      PrintWriter out, String permutationId) {
-    out.println("<tr><td>&nbsp;&nbsp;&nbsp;&nbsp;<a href=\""
-        + dependenciesFileName("total", packageName, permutationId) + "#"
-        + className + "\">See why it's live</a></td></tr>");
-    for (int sp = 1; sp <= globalInformation.getNumSplitPoints(); sp++) {
-      out.println("<tr><td>&nbsp;&nbsp;&nbsp;&nbsp;<a href=\""
-          + dependenciesFileName("sp" + sp, packageName, permutationId) + "#"
-          + className + "\">See why it's not exclusive to s.p. #" + sp + " ("
-          + globalInformation.getSplitPointToLocation().get(sp)
-          + ")</a></td></tr>");
-    }
+  public void setGlobalInformation(GlobalInformation globalInformation) {
+    this.globalInformation = globalInformation;
   }
 
-  private void addStandardHtmlEnding(final PrintWriter out) {
-    out.println("</div>");
-    out.println("</body>");
-    out.println("</html>");
-  }
-
-  private void addStandardHtmlProlog(final PrintWriter out, String title,
-      String header) {
-    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
-    out.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
-    out.println("<html>");
-    out.println("<head>");
-    out.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
-    out.println("<title>" + title + "</title>");
-    out.println("</head>");
-
-    out.println("<style type=\"text/css\">");
-    out.println("body {background-color: #728FCE}");
-    out.println("h2 {background-color: transparent}");
-    out.println("p {background-color: fuchsia}");
-    out.println("</style>");
-
-    out.println("<body>");
-    out.println("<center>");
-    out.println("<h2>" + title + "</h2>");
-    if (header != null) {
-      addCenteredHeader(out, header);
-    }
-    out.println("</center>");
+  public void setSettings(Settings settings) {
+    this.settings = settings;
   }
 
   private void addDependenciesHtmlProlog(final PrintWriter out, String title,
@@ -1143,7 +1003,51 @@
       addCenteredHeader(out, header);
     }
     out.println("</center>");
+  }
 
+  private void addLefttoversStatus(String className, String packageName,
+      PrintWriter out, String permutationId) {
+    out.println("<tr><td>&nbsp;&nbsp;&nbsp;&nbsp;<a href=\""
+        + dependenciesFileName("total", packageName, permutationId) + "#"
+        + className + "\">See why it's live</a></td></tr>");
+    for (int sp = 1; sp <= globalInformation.getNumSplitPoints(); sp++) {
+      out.println("<tr><td>&nbsp;&nbsp;&nbsp;&nbsp;<a href=\""
+          + dependenciesFileName("sp" + sp, packageName, permutationId) + "#"
+          + className + "\">See why it's not exclusive to s.p. #" + sp + " ("
+          + globalInformation.getSplitPointToLocation().get(sp)
+          + ")</a></td></tr>");
+    }
+  }
+
+  private void addStandardHtmlEnding(final PrintWriter out) {
+    out.println("</div>");
+    out.println("</body>");
+    out.println("</html>");
+  }
+
+  private void addStandardHtmlProlog(final PrintWriter out, String title,
+      String header) {
+    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
+    out.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
+    out.println("<html>");
+    out.println("<head>");
+    out.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
+    out.println("<title>" + title + "</title>");
+    out.println("</head>");
+
+    out.println("<style type=\"text/css\">");
+    out.println("body {background-color: #728FCE}");
+    out.println("h2 {background-color: transparent}");
+    out.println("p {background-color: fuchsia}");
+    out.println("</style>");
+
+    out.println("<body>");
+    out.println("<center>");
+    out.println("<h2>" + title + "</h2>");
+    if (header != null) {
+      addCenteredHeader(out, header);
+    }
+    out.println("</center>");
   }
 
   private String dependenciesFileName(String depGraphName, String packageName,
@@ -1152,11 +1056,171 @@
         + "-" + permutationId + ".html";
   }
 
+  /**
+   * Return a {@link File} object for a file to be emitted into the output
+   * directory.
+   */
+  private File getOutFile(String localFileName) {
+    File outDir = new File(settings.out.get());
+    return new File(outDir, localFileName);
+  }
+
+  /**
+   * Describe the code covered by the dependency graph with the supplied name.
+   */
+  private String inferDepGraphDescription(String depGraphName) {
+    if (depGraphName.equals("initial")) {
+      return "Initially Live Code";
+    }
+
+    if (depGraphName.equals("total")) {
+      return "All Code";
+    }
+
+    Matcher matcher = PATTERN_SP_INT.matcher(depGraphName);
+    if (matcher.matches()) {
+      int splitPoint = Integer.valueOf(matcher.group(1));
+      if (isInitialSplitPoint(splitPoint)) {
+        return "Code Becoming Live at Split Point " + splitPoint;
+      } else {
+        return "Code not Exclusive to Split Point " + splitPoint;
+      }
+    }
+
+    throw new RuntimeException("Unexpected dependency graph name: "
+        + depGraphName);
+  }
+
+  private boolean isInitialSplitPoint(int splitPoint) {
+    return globalInformation.getSplitPointInitialLoadSequence().contains(
+        splitPoint);
+  }
+
   private String leftoversStatusFileName(String className, String permutationId) {
     return "leftoverStatus-" + filename(className) + "-" + permutationId
         + ".html";
   }
 
+  private String makeCodeTypeHtml(SizeBreakdown breakdown,
+      Map<String, CodeCollection> nameToCodeColl,
+      Map<String, LiteralsCollection> nameToLitColl, String permutationId)
+      throws IOException {
+    String outFileName = breakdown.getId() + "-" + permutationId
+        + "_codeTypeBreakdown.html";
+    float maxSize = 0f;
+    float sumSize = 0f;
+    TreeMap<Float, String> sortedCodeTypes = new TreeMap<Float, String>(
+        Collections.reverseOrder());
+
+    for (String codeType : nameToCodeColl.keySet()) {
+      float curSize = nameToCodeColl.get(codeType).getCumPartialSize(breakdown);
+      sumSize += curSize;
+
+      if (curSize != 0f) {
+        sortedCodeTypes.put(curSize, codeType);
+        if (curSize > maxSize) {
+          maxSize = curSize;
+        }
+      }
+    }
+
+    final PrintWriter outFile = new PrintWriter(getOutFile(outFileName));
+
+    outFile.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
+    outFile.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
+    outFile.println("<html>");
+    outFile.println("<head>");
+    outFile.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
+    outFile.println("<link rel=\"stylesheet\" href=\"common.css\" media=\"screen\">");
+    outFile.println("</head>");
+
+    outFile.println("<body>");
+    outFile.println("<table style='width:100%'>");
+    outFile.println("<thead>");
+    outFile.println("<th class='barlabel'>Size</th>");
+
+    outFile.println("<th class='barlabel'>Percentage</th>");
+    outFile.println("<th class='barlabel'></th>");
+    outFile.println("<th style='width:100%' class='barlabel'></th>");
+    outFile.println("</thead>");
+
+    for (Float size : sortedCodeTypes.keySet()) {
+
+      String codeType = sortedCodeTypes.get(size);
+      String drillDownFileName = breakdown.getId() + "_" + codeType + "-"
+          + permutationId + "Classes.html";
+
+      float ratio = (size / maxSize) * 79;
+      float perc = (size / sumSize) * 100;
+
+      if (ratio < 5) {
+        ratio = 5;
+      }
+
+      outFile.println("<tr>");
+      outFile.println("<td class=\"barlabel\">" + size + "</td>");
+      outFile.println("<td class=\"barlabel\">" + perc + "%</td>");
+      outFile.println("<td class=\"barlabel\"><a href=\"" + drillDownFileName
+          + "\" target=\"_top\">" + codeType + "</a></td>");
+      outFile.println("<td class=\"box\">");
+      outFile.println("<div style=\"width:"
+          + ratio
+          + "%;\" class=\"lb\"><div class=\"rb\"><div class=\"bb\"><div class=\"blc\"><div class=\"brc\"><div class=\"tb\"><div class=\"tlc\"><div class=\"trc\"><div class=\"content\"></div></div></div></div></div></div></div></div>");
+      outFile.println("</td>");
+      outFile.println("</tr>");
+    }
+
+    maxSize = 0f;
+    sumSize = 0f;
+    TreeMap<Float, String> sortedLitTypes = new TreeMap<Float, String>(
+        Collections.reverseOrder());
+
+    for (String literal : nameToLitColl.keySet()) {
+      float curSize = nameToLitColl.get(literal).size;
+      sumSize += curSize;
+
+      if (curSize != 0f) {
+        sortedLitTypes.put(curSize, literal);
+
+        if (curSize > maxSize) {
+          maxSize = curSize;
+        }
+      }
+    }
+
+    for (Float size : sortedLitTypes.keySet()) {
+      String literal = sortedLitTypes.get(size);
+      String drillDownFileName = breakdown.getId() + "_" + literal + "-"
+          + permutationId + "Lits.html";
+
+      float ratio = (size / maxSize) * 79;
+      float perc = (size / sumSize) * 100;
+
+      if (ratio < 5) {
+        ratio = 5;
+      }
+
+      outFile.println("<tr>");
+      outFile.println("<td class=\"barlabel\">" + size + "</td>");
+      outFile.println("<td class=\"barlabel\">" + perc + "%</td>");
+      outFile.println("<td class=\"barlabel\"><a href=\"" + drillDownFileName
+          + "\" target=\"_top\">" + literal + "</a></td>");
+      outFile.println("<td class=\"box\">");
+      outFile.println("<div style=\"width:"
+          + ratio
+          + "%;\" class=\"lb\"><div class=\"rb\"><div class=\"bb\"><div class=\"blc\"><div class=\"brc\"><div class=\"tb\"><div class=\"tlc\"><div class=\"trc\"><div class=\"content\"></div></div></div></div></div></div></div></div>");
+      outFile.println("</td>");
+      outFile.println("</tr>");
+    }
+
+    outFile.println("</table>");
+    outFile.println("</body>");
+    outFile.println("</html>");
+    outFile.close();
+
+    return outFileName;
+  }
+
   private void makeDependenciesHtml(String depGraphName,
       Map<String, String> dependencies, String permutationId)
       throws FileNotFoundException {
@@ -1300,7 +1364,6 @@
           + "%;\" class=\"lb\"><div class=\"rb\"><div class=\"bb\"><div class=\"blc\"><div class=\"brc\"><div class=\"tb\"><div class=\"tlc\"><div class=\"trc\"><div class=\"content\"></div></div></div></div></div></div></div></div>");
       outFile.println("</td>");
       outFile.println("</tr>");
-
     }
 
     outFile.println("</table>");
@@ -1359,55 +1422,4 @@
   private String splitStatusFileName(String className, String permutationId) {
     return "splitStatus-" + filename(className) + "-" + permutationId + ".html";
   }
-
-  public void makeTopLevelHtmlForAllPerms() throws FileNotFoundException {
-
-    PrintWriter outFile = new PrintWriter(getOutFile("index.html"));
-
-    outFile.println("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">");
-    outFile.println("<html>");
-    outFile.println("<head>");
-    outFile.println("  <title>Story of Your Compile - Top Level Dashboard for all Permutations</title>");
-    outFile.println("<style type=\"text/css\">");
-    outFile.println("body {background-color: #728FCE}");
-    outFile.println("h2 {background-color: transparent}");
-    outFile.println("</style>");
-    outFile.println("</head>");
-
-    outFile.println("<body>");
-    outFile.println("<center>");
-    outFile.println("<h1>Story of Your Compile</h1>");
-    outFile.println("<hr>");
-    outFile.println("<h3>Story of Your Compile - Overview of Permutations</h3>");
-    outFile.println("<hr>");
-
-    outFile.println("<div style='overflow:auto; background-color:white'>");
-    outFile.println("<center>");
-    for (String permutationId : settings.allPermsInfo.keySet()) {
-      String permutationInfo = settings.allPermsInfo.get(permutationId);
-      outFile.print("<p><a href=\"SoycDashboard" + "-" + permutationId
-          + "-index.html\">Permutation " + permutationId);
-      if (permutationInfo.length() > 0) {
-        outFile.println(" (" + permutationInfo + ")" + "</a>");
-      } else {
-        outFile.println("</a>");
-      }
-    }
-    outFile.println("</center>");
-    outFile.println("</div>");
-    addStandardHtmlEnding(outFile);
-    outFile.close();
-  }
-
-  public GlobalInformation getGlobalInformation() {
-    return globalInformation;
-  }
-
-  public void setGlobalInformation(GlobalInformation globalInformation) {
-    this.globalInformation = globalInformation;
-  }
-
-  public void setSettings(Settings settings) {
-    this.settings = settings;
-  }
 }
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/Settings.java b/dev/core/src/com/google/gwt/soyc/Settings.java
similarity index 99%
rename from tools/soyc-vis/src/com/google/gwt/soyc/Settings.java
rename to dev/core/src/com/google/gwt/soyc/Settings.java
index 22e6eea..8b9732d 100644
--- a/tools/soyc-vis/src/com/google/gwt/soyc/Settings.java
+++ b/dev/core/src/com/google/gwt/soyc/Settings.java
@@ -184,37 +184,29 @@
     return help.toString();
   }
 
+  public Map<String, String> allPermsInfo = new TreeMap<String, String>();
+  public String depFileName;
+  public Boolean displayDependencies = false;
+  public Boolean displaySplitPoints = false;
+
   public final Setting<String> out = addSetting(new StringSetting("-out",
       "dir", ".", "output directory"));
+
   public final Setting<String> resources = addSetting(new StringSetting(
       "-resources", "jarfile", null,
       " directory or jar file with CSS, etc., resources"));
+
   public final Setting<String> soycDir = addSetting(new StringSetting(
       "-soycDir", "dir", null, " directory for soyc files"));
-  public final Setting<String> symbolMapsDir = addSetting(new StringSetting(
-      "-symbolMapsDir", "dir", null, " directory or symbol maps files"));
-
-  public String depFileName;
 
   public String splitPointsFileName;
 
   public String storiesFileName;
 
+  public final Setting<String> symbolMapsDir = addSetting(new StringSetting(
+      "-symbolMapsDir", "dir", null, " directory or symbol maps files"));
+
   private List<Setting<?>> allSettings;
-
-  private <T> Setting<T> addSetting(Setting<T> setting) {
-    if (allSettings == null) {
-      allSettings = new ArrayList<Setting<?>>();
-    }
-    allSettings.add(setting);
-    return setting;
-  }
-
-  public Map<String, String> allPermsInfo = new TreeMap<String, String>();
-
-  public Boolean displayDependencies = false;
-  public Boolean displaySplitPoints = false;
-
   public void readPermutationInfo() throws FileNotFoundException {
 
     if (symbolMapsDir.get() == null) {
@@ -254,4 +246,12 @@
     }
   }
 
+  private <T> Setting<T> addSetting(Setting<T> setting) {
+    if (allSettings == null) {
+      allSettings = new ArrayList<Setting<?>>();
+    }
+    allSettings.add(setting);
+    return setting;
+  }
+
 }
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/SizeBreakdown.java b/dev/core/src/com/google/gwt/soyc/SizeBreakdown.java
similarity index 99%
rename from tools/soyc-vis/src/com/google/gwt/soyc/SizeBreakdown.java
rename to dev/core/src/com/google/gwt/soyc/SizeBreakdown.java
index 64a1102..672b23b 100644
--- a/tools/soyc-vis/src/com/google/gwt/soyc/SizeBreakdown.java
+++ b/dev/core/src/com/google/gwt/soyc/SizeBreakdown.java
@@ -23,6 +23,43 @@
  * A size breakdown of one code collection.
  */
 public class SizeBreakdown {
+  public Map<String, Integer> classToSize = new HashMap<String, Integer>();
+
+  public HashMap<String, CodeCollection> nameToCodeColl = new HashMap<String, CodeCollection>();
+
+  public Map<String, LiteralsCollection> nameToLitColl = new TreeMap<String, LiteralsCollection>();
+  public Map<String, Integer> packageToSize = new HashMap<String, Integer>();
+  public int sizeAllCode;
+  private final String description;
+
+  private final String id;
+
+  public SizeBreakdown(String description, String id) {
+    this.description = description;
+    this.id = id;
+
+    initializeLiteralsCollection(nameToLitColl);
+    initializeNameToCodeCollection(nameToCodeColl);
+  }
+  /**
+   * A short but human-readable description of this code collection.
+   */
+  public String getDescription() {
+    return description;
+  }
+
+  /**
+   * An identifier for this code collection suitable for use within file names.
+   */
+  public String getId() {
+    return id;
+  }
+
+  @Override
+  public String toString() {
+    return getId();
+  }
+
   private void initializeLiteralsCollection(
       Map<String, LiteralsCollection> nameToLitColl) {
     nameToLitColl.put("long", new LiteralsCollection());
@@ -48,41 +85,4 @@
     nameToCodeColl.put("gwtLang", new CodeCollection());
     nameToCodeColl.put("jre", new CodeCollection());
   }
-
-  public Map<String, Integer> classToSize = new HashMap<String, Integer>();
-  public HashMap<String, CodeCollection> nameToCodeColl = new HashMap<String, CodeCollection>();
-  public Map<String, LiteralsCollection> nameToLitColl = new TreeMap<String, LiteralsCollection>();
-  public Map<String, Integer> packageToSize = new HashMap<String, Integer>();
-
-  public int sizeAllCode;
-
-  private final String description;
-  private final String id;
-
-  public SizeBreakdown(String description, String id) {
-    this.description = description;
-    this.id = id;
-
-    initializeLiteralsCollection(nameToLitColl);
-    initializeNameToCodeCollection(nameToCodeColl);
-  }
-
-  /**
-   * A short but human-readable description of this code collection.
-   */
-  public String getDescription() {
-    return description;
-  }
-
-  /**
-   * An identifier for this code collection suitable for use within file names.
-   */
-  public String getId() {
-    return id;
-  }
-
-  @Override
-  public String toString() {
-    return getId();
-  }
 }
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/SoycDashboard.java b/dev/core/src/com/google/gwt/soyc/SoycDashboard.java
similarity index 100%
rename from tools/soyc-vis/src/com/google/gwt/soyc/SoycDashboard.java
rename to dev/core/src/com/google/gwt/soyc/SoycDashboard.java
diff --git a/tools/soyc-vis/build.xml b/tools/soyc-vis/build.xml
index b46b267..d6d4caa 100644
--- a/tools/soyc-vis/build.xml
+++ b/tools/soyc-vis/build.xml
@@ -14,12 +14,6 @@
   </target>
 
   <target name="compile">
-    <mkdir dir="${javac.out}"/>
-    <javac srcdir="src" destdir="${javac.out}">
-      <classpath>
-        <pathelement location="${gwt.dev.jar}" />
-      </classpath>
-    </javac>
     <mkdir dir="${javac.out}/com/google/gwt/soyc/resources/images"/>
     <copy todir="${javac.out}/com/google/gwt/soyc/resources/images">
       <fileset dir="images"/>
@@ -30,12 +24,13 @@
   </target>
 
   <target name="build" depends="compile">
-    <gwt.jar>
+    <!-- Build a transitional jar that is good enough for
+         passing as -resources to SoycDashboard.  This jar
+         is being phased out in favor of gwt-dev-platform.jar
+         holding all the SOYC bits.  -->
+    <jar destfile="${project.lib}">
       <fileset dir="${javac.out}" />
-      <manifest>
-        <attribute name="Main-Class" value="com.google.gwt.soyc.SoycDashboard" />
-      </manifest>
-    </gwt.jar>
+    </jar>
   </target>
 
   <target name="test"/>