Make SOYC produce consistent output. http://gwt-code-reviews.appspot.com/1338805/show Review by: robertvawter@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9682 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/core/ext/soyc/impl/SizeMapRecorder.java b/dev/core/src/com/google/gwt/core/ext/soyc/impl/SizeMapRecorder.java index 912f040..605e72f 100644 --- a/dev/core/src/com/google/gwt/core/ext/soyc/impl/SizeMapRecorder.java +++ b/dev/core/src/com/google/gwt/core/ext/soyc/impl/SizeMapRecorder.java
@@ -29,8 +29,10 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; +import java.util.Comparator; import java.util.Map; import java.util.Map.Entry; +import java.util.TreeMap; import java.util.zip.GZIPOutputStream; /** @@ -38,6 +40,16 @@ * then read to produce a Story of Your Compile. */ public class SizeMapRecorder { + + /** + * Sorts by JsName.getIdent(). + */ + private static final Comparator<JsName> JSNAME_SORT = new Comparator<JsName>() { + public int compare(JsName o1, JsName o2) { + return o1.getIdent().compareTo(o2.getIdent()); + } + }; + /** * A human-accessible type and description of a program reference. These are * produced by @@ -72,7 +84,7 @@ return toReturn; } - /** +/** * Escapes '&', '<', '>', '"', and '\'' to their XML entity equivalents. */ public static String escapeXml(String unescaped) { @@ -81,7 +93,7 @@ return builder.toString(); } - /** +/** * Escapes '&', '<', '>', '"', and optionally ''' to their XML entity * equivalents. The portion of the input string between start (inclusive) and * end (exclusive) is scanned. The output is appended to the given @@ -95,7 +107,7 @@ * @param builder a StringBuilder to be appended with the output. */ public static void escapeXml(String code, int start, int end, - boolean quoteApostrophe, StringBuilder builder) { + boolean quoteApostrophe, StringBuilder builder) { // See http://www.w3.org/TR/2006/REC-xml11-20060816/#charsets. int lastIndex = 0; int len = end - start; @@ -156,7 +168,7 @@ } builder.append(c, lastIndex, len - lastIndex); } - + /** * @param logger a TreeLogger */ @@ -172,7 +184,9 @@ for (int i = 0; i < sizeBreakdowns.length; i++) { writer.append("<sizemap fragment=\"" + i + "\" " + "size=\"" + sizeBreakdowns[i].getSize() + "\">\n"); - for (Entry<JsName, Integer> sizeMapEntry : sizeBreakdowns[i].getSizeMap().entrySet()) { + Map<JsName, Integer> sizeMap = new TreeMap<JsName, Integer>(JSNAME_SORT); + sizeMap.putAll(sizeBreakdowns[i].getSizeMap()); + for (Entry<JsName, Integer> sizeMapEntry : sizeMap.entrySet()) { JsName name = sizeMapEntry.getKey(); int size = sizeMapEntry.getValue(); TypedProgramReference typedRef = typedProgramReference(name, jjsmap,
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java index dcc2821..8e4aeb3 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java +++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
@@ -16,9 +16,11 @@ package com.google.gwt.dev.jjs.ast; import com.google.gwt.dev.jjs.ast.js.JMultiExpression; +import com.google.gwt.dev.jjs.impl.HasNameSort; import com.google.gwt.dev.util.collect.IdentityHashMap; import com.google.gwt.dev.util.collect.IdentityHashSet; import com.google.gwt.dev.util.collect.IdentitySets; +import com.google.gwt.dev.util.collect.Lists; import java.io.Serializable; import java.util.ArrayList; @@ -462,10 +464,11 @@ * building the full maps. */ JClassType jsoType = program.getJavaScriptObject(); - Set<JClassType> jsoSubTypes = Collections.emptySet(); + List<JClassType> jsoSubTypes = Lists.create(); if (jsoType != null) { assert jsoType.getImplements().size() == 0; - jsoSubTypes = get(subClassMap, jsoType); + jsoSubTypes = new ArrayList<JClassType>(get(subClassMap, jsoType)); + Collections.sort(jsoSubTypes, new HasNameSort()); for (JClassType jsoSubType : jsoSubTypes) { for (JInterfaceType intf : jsoSubType.getImplements()) { jsoType.addImplements(intf);
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java index 5dab288..b67bb11 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java +++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
@@ -205,7 +205,9 @@ rescue(type.getSuperClass(), true, isInstantiated); // Rescue my clinit (it won't ever be explicitly referenced) - rescue(type.getMethods().get(0)); + if (type.hasClinit()) { + rescue(type.getMethods().get(0)); + } // JLS 12.4.1: don't rescue my super interfaces just because I'm rescued. // However, if I'm instantiated, let's mark them as instantiated. @@ -273,7 +275,9 @@ assert (isReferenced || isInstantiated); // Rescue my clinit (it won't ever be explicitly referenced - rescue(type.getMethods().get(0)); + if (type.hasClinit()) { + rescue(type.getMethods().get(0)); + } // JLS 12.4.1: don't rescue my super interfaces just because I'm rescued. // However, if I'm instantiated, let's mark them as instantiated.
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/Pruner.java b/dev/core/src/com/google/gwt/dev/jjs/impl/Pruner.java index 28c6317..4cf1372 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/impl/Pruner.java +++ b/dev/core/src/com/google/gwt/dev/jjs/impl/Pruner.java
@@ -361,9 +361,12 @@ JMethod method = type.getMethods().get(i); if (!methodIsReferenced(method) || pruneViaNoninstantiability(isInstantiated, method)) { - type.removeMethod(i); - madeChanges(); - --i; + // Never prune clinit directly out of the class. + if (i > 0) { + type.removeMethod(i); + madeChanges(); + --i; + } } else { accept(method); }