Mostly looks good, just some style/simplicity comments on JProgram.
Thanks for the cleanups I noticed you did along the way. http://gwt-code-reviews.appspot.com/751803/diff/1/4 File dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java (right): http://gwt-code-reviews.appspot.com/751803/diff/1/4#newcode781 dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java:781: return returnMap; This whole setup seems kind of unnecessarily complicated to me. How about we just do this? 1) Final auto-initialize castableTypeMaps. 2) The init method just does a Map.putAll(). 3) You're not allowed to share the same expression node in different places in the tree anyway, so just do something like this: JsonObject result = castableTypeMaps.get(referenceType); if (result == null) { // auto-init to a null entry result = new JsonObject(...); castableTypeMaps.put(referenceType, result); } return result; Then you don't have to do any squirrelly null key stuff. Also, this should be an IdentityHashMap. http://gwt-code-reviews.appspot.com/751803/diff/1/6 File dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java (right): http://gwt-code-reviews.appspot.com/751803/diff/1/6#newcode73 dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java:73: new HashMap<JReferenceType, JsonObject>(); IdentityHashMap http://gwt-code-reviews.appspot.com/751803/show -- http://groups.google.com/group/Google-Web-Toolkit-Contributors