diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
index 220456a..ab9e5c4 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
@@ -24,9 +24,9 @@
 import com.google.gwt.core.ext.linker.EmittedArtifact;
 import com.google.gwt.core.ext.linker.EmittedArtifact.Visibility;
 import com.google.gwt.core.ext.linker.LinkerOrder;
+import com.google.gwt.core.ext.linker.LinkerOrder.Order;
 import com.google.gwt.core.ext.linker.PublicResource;
 import com.google.gwt.core.ext.linker.SelectionProperty;
-import com.google.gwt.core.ext.linker.LinkerOrder.Order;
 import com.google.gwt.dev.cfg.BindingProperty;
 import com.google.gwt.dev.cfg.ModuleDef;
 import com.google.gwt.dev.cfg.Property;
@@ -44,7 +44,6 @@
 import com.google.gwt.dev.js.JsUnusedFunctionRemover;
 import com.google.gwt.dev.js.JsVerboseNamer;
 import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsFunction;
 import com.google.gwt.dev.js.ast.JsModVisitor;
 import com.google.gwt.dev.js.ast.JsName;
@@ -92,7 +91,7 @@
     }
 
     @Override
-    public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsFunction x, JsContext ctx) {
       didChange |= JsStringInterner.exec(program, x.getBody(), x.getScope());
       return false;
     }
@@ -472,7 +471,8 @@
    * @param out where to emit the artifact contents
    */
   public void produceOutput(TreeLogger logger, ArtifactSet artifacts,
-      Visibility visibility, OutputFileSet out) throws UnableToCompleteException {
+      Visibility visibility, OutputFileSet out)
+      throws UnableToCompleteException {
     logger = logger.branch(TreeLogger.TRACE, "Linking " + visibility
         + " artifacts into " + out.getPathDescription(), null);
 
diff --git a/dev/core/src/com/google/gwt/dev/javac/JsniChecker.java b/dev/core/src/com/google/gwt/dev/javac/JsniChecker.java
index d637fc3..aae722a 100644
--- a/dev/core/src/com/google/gwt/dev/javac/JsniChecker.java
+++ b/dev/core/src/com/google/gwt/dev/javac/JsniChecker.java
@@ -21,7 +21,6 @@
 import com.google.gwt.dev.jjs.InternalCompilerException;
 import com.google.gwt.dev.jjs.SourceInfo;
 import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsFunction;
 import com.google.gwt.dev.js.ast.JsNameRef;
 import com.google.gwt.dev.js.ast.JsVisitor;
@@ -188,7 +187,7 @@
     }
 
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       this.errorInfo = x.getSourceInfo();
       String ident = x.getIdent();
       if (ident.charAt(0) == '@') {
diff --git a/dev/core/src/com/google/gwt/dev/jdt/FindJsniRefVisitor.java b/dev/core/src/com/google/gwt/dev/jdt/FindJsniRefVisitor.java
index 3e4e654..8d2cb36 100644
--- a/dev/core/src/com/google/gwt/dev/jdt/FindJsniRefVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/jdt/FindJsniRefVisitor.java
@@ -21,7 +21,6 @@
 import com.google.gwt.dev.js.JsParser;
 import com.google.gwt.dev.js.JsParserException;
 import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsNameRef;
 import com.google.gwt.dev.js.ast.JsProgram;
 import com.google.gwt.dev.js.ast.JsStatement;
@@ -96,7 +95,7 @@
           jsProgram.getScope(), sr);
       new JsVisitor() {
         @Override
-        public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+        public void endVisit(JsNameRef x, JsContext ctx) {
           String ident = x.getIdent();
           if (ident.charAt(0) == '@') {
             jsniRefs.add(ident.substring(1));
@@ -120,8 +119,10 @@
       return null; // ignore the error
     }
 
-    startPos += JsniCollector.JSNI_BLOCK_START.length() - 1; // move up to open brace
-    endPos += 1; // move past close brace
+    // move up to open brace
+    startPos += JsniCollector.JSNI_BLOCK_START.length() - 1;
+    // move past close brace
+    endPos += 1;
 
     jsniCode = jsniCode.substring(startPos, endPos);
     return jsniCode;
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniMethodBody.java b/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniMethodBody.java
index 698343b..c5d5f09 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniMethodBody.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniMethodBody.java
@@ -20,7 +20,6 @@
 import com.google.gwt.dev.jjs.ast.JAbstractMethodBody;
 import com.google.gwt.dev.jjs.ast.JVisitor;
 import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsFunction;
 import com.google.gwt.dev.js.ast.JsStringLiteral;
 import com.google.gwt.dev.js.ast.JsVisitor;
@@ -95,7 +94,7 @@
     final Set<String> result = new HashSet<String>();
     class RecordStrings extends JsVisitor {
       @Override
-      public void endVisit(JsStringLiteral lit, JsContext<JsExpression> ctx) {
+      public void endVisit(JsStringLiteral lit, JsContext ctx) {
         result.add(lit.getValue());
       }
     }
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 8f5a3b3..5dab288 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
@@ -51,7 +51,6 @@
 import com.google.gwt.dev.jjs.ast.js.JsniMethodBody;
 import com.google.gwt.dev.jjs.ast.js.JsniMethodRef;
 import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsFunction;
 import com.google.gwt.dev.js.ast.JsName;
 import com.google.gwt.dev.js.ast.JsNameRef;
@@ -320,7 +319,7 @@
 
         new JsVisitor() {
           @Override
-          public void endVisit(JsNameRef nameRef, JsContext<JsExpression> ctx) {
+          public void endVisit(JsNameRef nameRef, JsContext ctx) {
             JsName ident = nameRef.getName();
 
             if (ident != null) {
@@ -529,8 +528,8 @@
            * time, this would happen naturally since the instance method
            * delegates to the static. However, in cases where the static has
            * been inlined into the instance method, future optimization could
-           * tighten an instance call into a static call, reaching code that
-           * was pruned.
+           * tighten an instance call into a static call, reaching code that was
+           * pruned.
            */
           JMethod staticImpl = program.getStaticImpl(method);
           if (staticImpl != null) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/FragmentExtractor.java b/dev/core/src/com/google/gwt/dev/jjs/impl/FragmentExtractor.java
index c1958e5..88c152e 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/FragmentExtractor.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/FragmentExtractor.java
@@ -385,7 +385,7 @@
     final boolean[] anyLiveCode = new boolean[1];
     Cloner c = new Cloner() {
       @Override
-      public void endVisit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+      public void endVisit(JsBinaryOperation x, JsContext ctx) {
         JsExpression rhs = stack.pop();
         JsNameRef lhs = (JsNameRef) stack.pop();
         if (rhs instanceof JsNew || rhs instanceof JsObjectLiteral) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
index 2b5dba1..105d0f2 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
@@ -2958,7 +2958,7 @@
       }
 
       @Override
-      public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+      public void endVisit(JsNameRef x, JsContext ctx) {
         String ident = x.getIdent();
         if (ident.charAt(0) == '@') {
           processNameRef(x, ctx);
@@ -2985,7 +2985,7 @@
       }
 
       private void processField(JsNameRef nameRef, SourceInfo info,
-          JField field, JsContext<JsExpression> ctx) {
+          JField field, JsContext ctx) {
         /*
          * We must replace any compile-time constants with the constant value of
          * the field.
@@ -3012,14 +3012,14 @@
       }
 
       private void processMethod(JsNameRef nameRef, SourceInfo info,
-          JMethod method, JsContext<JsExpression> ctx) {
+          JMethod method, JsContext ctx) {
         assert !ctx.isLvalue();
         JsniMethodRef methodRef = new JsniMethodRef(info, nameRef.getIdent(),
             method, program.getJavaScriptObject());
         nativeMethodBody.addJsniRef(methodRef);
       }
 
-      private void processNameRef(JsNameRef nameRef, JsContext<JsExpression> ctx) {
+      private void processNameRef(JsNameRef nameRef, JsContext ctx) {
         SourceInfo info = nativeMethodBody.getSourceInfo();
         // TODO: make this tighter when we have real source info
         // JSourceInfo info = translateInfo(nameRef.getInfo());
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
index bc2288c..c878a3b 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
@@ -449,8 +449,9 @@
     private void recordSymbol(JReferenceType x, JsName jsName) {
       int queryId = program.getQueryId(x);
       JsonObject castableTypeMapObj = program.getCastableTypeMap(x);
-      CastableTypeMap castableTypeMap = new StandardCastableTypeMap(castableTypeMapObj.toString());
-      
+      CastableTypeMap castableTypeMap = new StandardCastableTypeMap(
+          castableTypeMapObj.toString());
+
       StandardSymbolData symbolData = StandardSymbolData.forClass(x.getName(),
           x.getSourceInfo().getFileName(), x.getSourceInfo().getStartLine(),
           queryId, castableTypeMap);
@@ -520,7 +521,7 @@
     private Map<JMethod, Integer> entryMethodToIndex;
 
     private final JsName arrayLength = objectScope.declareName("length");
-    
+
     private final JsName globalTemp = topScope.declareName("_");
 
     private final JsName prototype = objectScope.declareName("prototype");
@@ -632,7 +633,6 @@
       push(classLit.makeRef(x.getSourceInfo()));
     }
 
-    @SuppressWarnings("unchecked")
     @Override
     public void endVisit(JClassType x, Context ctx) {
       if (alreadyRan.contains(x)) {
@@ -1146,8 +1146,9 @@
       List<JsStatement> globalStmts = jsProgram.getGlobalBlock().getStatements();
 
       // Generate entry methods
-      generateGwtOnLoad(Arrays.asList(entryFunctions).subList(0,
-          x.getEntryCount(0)), globalStmts);
+      generateGwtOnLoad(
+          Arrays.asList(entryFunctions).subList(0, x.getEntryCount(0)),
+          globalStmts);
       generateNullFunc(globalStmts);
 
       // Add a few things onto the beginning.
@@ -1348,7 +1349,7 @@
         private JsNameRef dontReplaceCtor;
 
         @Override
-        public void endVisit(JsInvocation x, JsContext<JsExpression> ctx) {
+        public void endVisit(JsInvocation x, JsContext ctx) {
           // Replace invocation to ctor with a new op.
           if (x.getQualifier() instanceof JsNameRef) {
             JsNameRef ref = (JsNameRef) x.getQualifier();
@@ -1368,7 +1369,7 @@
         }
 
         @Override
-        public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+        public void endVisit(JsNameRef x, JsContext ctx) {
           String ident = x.getIdent();
           if (isJsniIdent(ident)) {
             HasEnclosingType node = program.jsniMap.get(ident);
@@ -1430,7 +1431,7 @@
         }
 
         @Override
-        public boolean visit(JsInvocation x, JsContext<JsExpression> ctx) {
+        public boolean visit(JsInvocation x, JsContext ctx) {
           if (x.getQualifier() instanceof JsNameRef) {
             dontReplaceCtor = (JsNameRef) x.getQualifier();
           }
@@ -1500,8 +1501,9 @@
       return new JsBinaryOperation(lhs.getSourceInfo(), JsBinaryOperator.COMMA,
           lhs, rhs);
     }
-    
-    private void generateCastableTypeMap(JClassType x, List<JsStatement> globalStmts) {
+
+    private void generateCastableTypeMap(JClassType x,
+        List<JsStatement> globalStmts) {
       JsonObject castableTypeMap = program.getCastableTypeMap(x);
       if (castableTypeMap != null) {
         JField castableTypeMapField = program.getIndexedField("Object.castableTypeMap");
@@ -1510,25 +1512,25 @@
           // Was pruned; this compilation must have no dynamic casts.
           return;
         }
-        
+
         SourceInfo sourceInfo = jsProgram.createSourceInfoSynthetic(
-              GenerateJavaScriptAST.class, "Castable type map");
-        
+            GenerateJavaScriptAST.class, "Castable type map");
+
         accept(castableTypeMap);
         JsExpression objExpr = pop();
-        
+
         // Generate castableTypeMap for each type prototype
         // _.castableTypeMap$ = {2:1, 4:1, 12:1};
         JsNameRef fieldRef = castableTypeMapName.makeRef(sourceInfo);
         fieldRef.setQualifier(globalTemp.makeRef(sourceInfo));
         JsExpression asg = createAssignment(fieldRef, objExpr);
-        
+
         JsExprStmt asgStmt = asg.makeStmt();
         globalStmts.add(asgStmt);
         typeForStatMap.put(asgStmt, x);
-      }   
+      }
     }
-    
+
     private void generateClassLiteral(JDeclarationStatement decl, JsVars vars) {
       JField field = (JField) decl.getVariableRef().getTarget();
       JsName jsName = names.get(field);
@@ -1624,8 +1626,9 @@
           topScope.findExistingUnobfuscatableName("$moduleName").makeRef(
               sourceInfo), modName.makeRef(sourceInfo));
       body.getStatements().add(asg.makeStmt());
-      asg = createAssignment(topScope.findExistingUnobfuscatableName(
-          "$moduleBase").makeRef(sourceInfo), modBase.makeRef(sourceInfo));
+      asg = createAssignment(
+          topScope.findExistingUnobfuscatableName("$moduleBase").makeRef(
+              sourceInfo), modBase.makeRef(sourceInfo));
       body.getStatements().add(asg.makeStmt());
 
       // Assignment to CollapsedPropertyHolder.permutationId only if it's used
@@ -1804,7 +1807,7 @@
       globalStmts.add(stmt);
       typeForStatMap.put(stmt, program.getTypeJavaLangObject());
     }
-    
+
     private void generateVTables(JClassType x, List<JsStatement> globalStmts) {
       for (JMethod method : x.getMethods()) {
         SourceInfo sourceInfo = method.getSourceInfo().makeChild(
@@ -1832,8 +1835,9 @@
       SourceInfo sourceInfo = clinitFunc.getSourceInfo().makeChild(
           GenerateJavaScriptVisitor.class, "clinit reassignment");
       // self-assign to the null method immediately (to prevent reentrancy)
-      JsExpression asg = createAssignment(clinitFunc.getName().makeRef(
-          sourceInfo), nullMethodName.makeRef(sourceInfo));
+      JsExpression asg = createAssignment(
+          clinitFunc.getName().makeRef(sourceInfo),
+          nullMethodName.makeRef(sourceInfo));
       statements.add(0, asg.makeStmt());
     }
 
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptLiterals.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptLiterals.java
index f848152..e9c55c2 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptLiterals.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptLiterals.java
@@ -45,7 +45,7 @@
 public class GenerateJavaScriptLiterals extends JVisitor {
 
   private final JsProgram program;
-  private final Stack<JsVisitable<?>> nodeStack = new Stack<JsVisitable<?>>();
+  private final Stack<JsVisitable> nodeStack = new Stack<JsVisitable>();
 
   public GenerateJavaScriptLiterals(JsProgram program) {
     this.program = program;
@@ -114,7 +114,6 @@
     return (T) nodeStack.pop();
   }
 
-  @SuppressWarnings("unchecked")
   protected final <T extends JsVisitable> List<T> popList(int count) {
     List<T> list = new ArrayList<T>();
     while (count > 0) {
@@ -128,7 +127,6 @@
     return list;
   }
 
-  @SuppressWarnings("unchecked")
   protected final <T extends JsVisitable> void popList(List<T> collection,
       int count) {
     List<T> list = new ArrayList<T>();
@@ -143,7 +141,6 @@
     collection.addAll(list);
   }
 
-  @SuppressWarnings("unchecked")
   protected final <T extends JsVisitable> void push(T node) {
     nodeStack.push(node);
   }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/HandleCrossFragmentReferences.java b/dev/core/src/com/google/gwt/dev/jjs/impl/HandleCrossFragmentReferences.java
index 31a9b49..6e6765c 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/HandleCrossFragmentReferences.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/HandleCrossFragmentReferences.java
@@ -22,25 +22,23 @@
 import com.google.gwt.dev.js.ast.JsBinaryOperation;
 import com.google.gwt.dev.js.ast.JsBinaryOperator;
 import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsFunction;
 import com.google.gwt.dev.js.ast.JsModVisitor;
 import com.google.gwt.dev.js.ast.JsName;
 import com.google.gwt.dev.js.ast.JsNameRef;
 import com.google.gwt.dev.js.ast.JsObjectLiteral;
 import com.google.gwt.dev.js.ast.JsProgram;
-import com.google.gwt.dev.js.ast.JsStatement;
 import com.google.gwt.dev.js.ast.JsVars;
-import com.google.gwt.dev.js.ast.JsVisitor;
 import com.google.gwt.dev.js.ast.JsVars.JsVar;
+import com.google.gwt.dev.js.ast.JsVisitor;
 
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
-import java.util.Set;
 import java.util.Map.Entry;
+import java.util.Set;
 
 /**
  * Rewrite JavaScript to better handle references from one code fragment to
@@ -50,9 +48,9 @@
  */
 public class HandleCrossFragmentReferences {
   /**
-   * Find out which islands define and use each named function or variable.
-   * This visitor is not smart about which definitions and uses matter.  It
-   * blindly records all of them.
+   * Find out which islands define and use each named function or variable. This
+   * visitor is not smart about which definitions and uses matter. It blindly
+   * records all of them.
    */
   private class FindNameReferences extends JsVisitor {
     Map<JsName, Set<Integer>> islandsDefining = new LinkedHashMap<JsName, Set<Integer>>();
@@ -60,7 +58,7 @@
     private int currentIsland;
 
     @Override
-    public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsFunction x, JsContext ctx) {
       JsName name = x.getName();
       if (name != null) {
         definitionSeen(name);
@@ -68,7 +66,7 @@
     }
 
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       if (x.getQualifier() == null) {
         JsName name = x.getName();
         if (name != null) {
@@ -78,7 +76,7 @@
     }
 
     @Override
-    public void endVisit(JsVars x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsVars x, JsContext ctx) {
       for (JsVar var : x) {
         JsName name = var.getName();
         if (name != null) {
@@ -88,7 +86,7 @@
     }
 
     @Override
-    public boolean visit(JsProgram x, JsContext<JsProgram> ctx) {
+    public boolean visit(JsProgram x, JsContext ctx) {
       for (int i = 0; i < x.getFragmentCount(); i++) {
         currentIsland = i;
         accept(x.getFragmentBlock(i));
@@ -126,7 +124,7 @@
    */
   private class RewriteDeclsAndRefs extends JsModVisitor {
     @Override
-    public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsFunction x, JsContext ctx) {
       if (namesToPredefine.contains(x.getName())) {
         JsBinaryOperation asg = new JsBinaryOperation(x.getSourceInfo(),
             JsBinaryOperator.ASG, makeRefViaJslink(x.getName(),
@@ -137,14 +135,14 @@
     }
 
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       if (namesToPredefine.contains(x.getName())) {
         ctx.replaceMe(makeRefViaJslink(x.getName(), x.getSourceInfo()));
       }
     }
 
     @Override
-    public void endVisit(JsVars x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsVars x, JsContext ctx) {
       if (!ctx.canInsert()) {
         return;
       }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/MakeCallsStatic.java b/dev/core/src/com/google/gwt/dev/jjs/impl/MakeCallsStatic.java
index 26cbffb..1841193 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/MakeCallsStatic.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/MakeCallsStatic.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- *
+ * 
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -37,7 +37,6 @@
 import com.google.gwt.dev.jjs.ast.js.JMultiExpression;
 import com.google.gwt.dev.jjs.ast.js.JsniMethodBody;
 import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsFunction;
 import com.google.gwt.dev.js.ast.JsModVisitor;
 import com.google.gwt.dev.js.ast.JsName;
@@ -89,13 +88,13 @@
       }
 
       @Override
-      public void endVisit(JsThisRef x, JsContext<JsExpression> ctx) {
+      public void endVisit(JsThisRef x, JsContext ctx) {
         ctx.replaceMe(thisParam.makeRef(x.getSourceInfo().makeChild(
             RewriteJsniMethodBody.class, "Devirtualized instance")));
       }
 
       @Override
-      public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+      public boolean visit(JsFunction x, JsContext ctx) {
         // Don't recurse into nested functions!
         return false;
       }
@@ -111,7 +110,7 @@
       private final JParameter thisParam;
       private final Map<JParameter, JParameter> varMap;
 
-      public RewriteMethodBody(JParameter thisParam, 
+      public RewriteMethodBody(JParameter thisParam,
           Map<JParameter, JParameter> varMap) {
         this.thisParam = thisParam;
         this.varMap = varMap;
@@ -191,7 +190,7 @@
           CreateStaticImplsVisitor.class, "Degelgating to devirtualized method");
       JMethodBody newBody = new JMethodBody(delegateCallSourceInfo);
       x.setBody(newBody);
-      JMethodCall newCall = new JMethodCall(delegateCallSourceInfo, null, 
+      JMethodCall newCall = new JMethodCall(delegateCallSourceInfo, null,
           newMethod);
       newCall.addArg(new JThisRef(delegateCallSourceInfo, enclosingType));
       for (int i = 0; i < x.getParams().size(); ++i) {
@@ -216,8 +215,10 @@
         // TODO: Do we really need to do that in BuildTypeMap?
         JsFunction jsFunc = ((JsniMethodBody) movedBody).getFunc();
         JsName paramName = jsFunc.getScope().declareName("this$static");
-        jsFunc.getParameters().add(0, new JsParameter(sourceInfo.makeChild(
-            CreateStaticImplsVisitor.class, "Static accessor"), paramName));
+        jsFunc.getParameters().add(
+            0,
+            new JsParameter(sourceInfo.makeChild(
+                CreateStaticImplsVisitor.class, "Static accessor"), paramName));
         RewriteJsniMethodBody rewriter = new RewriteJsniMethodBody(paramName);
         // Accept the body to avoid the recursion blocker.
         rewriter.accept(jsFunc.getBody());
@@ -324,7 +325,7 @@
       if (isRunCallbacksMethod(x.getTarget())) {
         /*
          * Don't devirtualize these calls created by FragmentLoaderCreator,
-         * because it spoils code splitting. 
+         * because it spoils code splitting.
          * 
          * TODO(spoon) remove this once FragmentLoaderCreator is gone
          */
@@ -336,7 +337,8 @@
 
     @Override
     public boolean visit(JMethod x, Context ctx) {
-      currentMethodIsInitiallyLive = initiallyLive.getLiveFieldsAndMethods().contains(x);
+      currentMethodIsInitiallyLive = initiallyLive.getLiveFieldsAndMethods().contains(
+          x);
       return true;
     }
 
@@ -348,8 +350,8 @@
   }
 
   public static OptimizerStats exec(JProgram program) {
-    Event optimizeEvent = SpeedTracerLogger.start(
-        CompilerEventType.OPTIMIZE, "optimizer", NAME);
+    Event optimizeEvent = SpeedTracerLogger.start(CompilerEventType.OPTIMIZE,
+        "optimizer", NAME);
     OptimizerStats stats = new MakeCallsStatic(program).execImpl();
     optimizeEvent.end("didChange", "" + stats.didChange());
     return stats;
diff --git a/dev/core/src/com/google/gwt/dev/js/EvalFunctionsAtTopScope.java b/dev/core/src/com/google/gwt/dev/js/EvalFunctionsAtTopScope.java
index 39e76d7..e7f97ad 100644
--- a/dev/core/src/com/google/gwt/dev/js/EvalFunctionsAtTopScope.java
+++ b/dev/core/src/com/google/gwt/dev/js/EvalFunctionsAtTopScope.java
@@ -18,13 +18,12 @@
 import com.google.gwt.dev.jjs.impl.JavaToJavaScriptMap;
 import com.google.gwt.dev.js.ast.JsBlock;
 import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsExpression;
+import com.google.gwt.dev.js.ast.JsExprStmt;
 import com.google.gwt.dev.js.ast.JsFunction;
 import com.google.gwt.dev.js.ast.JsModVisitor;
 import com.google.gwt.dev.js.ast.JsProgram;
 import com.google.gwt.dev.js.ast.JsProgramFragment;
 import com.google.gwt.dev.js.ast.JsStatement;
-import com.google.gwt.dev.js.ast.JsExprStmt;
 
 import java.util.HashSet;
 import java.util.ListIterator;
@@ -46,41 +45,41 @@
   }
 
   private JsStatement currentStatement;
-  
+
   private final Set<JsFunction> dontMove = new HashSet<JsFunction>();
 
   private final Stack<ListIterator<JsStatement>> itrStack = new Stack<ListIterator<JsStatement>>();
 
   private JavaToJavaScriptMap java2jsMap;
-  
+
   private final Stack<JsBlock> scopeStack = new Stack<JsBlock>();
-  
+
   public EvalFunctionsAtTopScope(JavaToJavaScriptMap java2jsMap) {
     this.java2jsMap = java2jsMap;
   }
-  
+
   @Override
-  public void endVisit(JsExprStmt x, JsContext<JsStatement> ctx) {
-    currentStatement = null;     
+  public void endVisit(JsExprStmt x, JsContext ctx) {
+    currentStatement = null;
   }
-  
+
   @Override
-  public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsFunction x, JsContext ctx) {
     scopeStack.pop();
   }
 
   @Override
-  public void endVisit(JsProgram x, JsContext<JsProgram> ctx) {
+  public void endVisit(JsProgram x, JsContext ctx) {
     scopeStack.pop();
   }
 
   @Override
-  public void endVisit(JsProgramFragment x, JsContext<JsProgramFragment> ctx) {
+  public void endVisit(JsProgramFragment x, JsContext ctx) {
     scopeStack.pop();
   }
 
   @Override
-  public boolean visit(JsBlock x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsBlock x, JsContext ctx) {
     if (x == scopeStack.peek()) {
       ListIterator<JsStatement> itr = x.getStatements().listIterator();
       itrStack.push(itr);
@@ -106,22 +105,22 @@
   }
 
   @Override
-  public boolean visit(JsExprStmt x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsExprStmt x, JsContext ctx) {
     currentStatement = x;
     return true;
   }
 
   @Override
-  public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsFunction x, JsContext ctx) {
     JsStaticEval.isFunctionDecl(currentStatement);
-    
+
     /*
-     * We do this during visit() to preserve first-to-last evaluation order.
-     * We check if this function is a vtable declaration and don't 
-     * move functions used in other expressions or are in vtable assignments.
+     * We do this during visit() to preserve first-to-last evaluation order. We
+     * check if this function is a vtable declaration and don't move functions
+     * used in other expressions or are in vtable assignments.
      */
-    if (x.getName() != null && !dontMove.contains(x) && 
-        !isVtableDeclaration(currentStatement)) {
+    if (x.getName() != null && !dontMove.contains(x)
+        && !isVtableDeclaration(currentStatement)) {
       /*
        * Reinsert this function into the statement immediately before the
        * current statement. The current statement will have already been
@@ -143,17 +142,17 @@
   }
 
   @Override
-  public boolean visit(JsProgram x, JsContext<JsProgram> ctx) {
+  public boolean visit(JsProgram x, JsContext ctx) {
     scopeStack.push(x.getGlobalBlock());
     return true;
   }
 
   @Override
-  public boolean visit(JsProgramFragment x, JsContext<JsProgramFragment> ctx) {
+  public boolean visit(JsProgramFragment x, JsContext ctx) {
     scopeStack.push(x.getGlobalBlock());
     return true;
   }
-  
+
   private boolean isVtableDeclaration(JsStatement currentStatement) {
     return java2jsMap.vtableInitToMethod(currentStatement) != null;
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/JsAbstractSymbolResolver.java b/dev/core/src/com/google/gwt/dev/js/JsAbstractSymbolResolver.java
index b28cfcc..f063e6e 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsAbstractSymbolResolver.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsAbstractSymbolResolver.java
@@ -17,7 +17,6 @@
 
 import com.google.gwt.dev.js.ast.JsCatch;
 import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsFunction;
 import com.google.gwt.dev.js.ast.JsNameRef;
 import com.google.gwt.dev.js.ast.JsProgram;
@@ -34,17 +33,17 @@
   private final Stack<JsScope> scopeStack = new Stack<JsScope>();
 
   @Override
-  public void endVisit(JsCatch x, JsContext<JsCatch> ctx) {
+  public void endVisit(JsCatch x, JsContext ctx) {
     popScope();
   }
 
   @Override
-  public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsFunction x, JsContext ctx) {
     popScope();
   }
 
   @Override
-  public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsNameRef x, JsContext ctx) {
     if (x.isResolved()) {
       return;
     }
@@ -53,24 +52,24 @@
   }
 
   @Override
-  public void endVisit(JsProgram x, JsContext<JsProgram> ctx) {
+  public void endVisit(JsProgram x, JsContext ctx) {
     popScope();
   }
 
   @Override
-  public boolean visit(JsCatch x, JsContext<JsCatch> ctx) {
+  public boolean visit(JsCatch x, JsContext ctx) {
     pushScope(x.getScope());
     return true;
   }
 
   @Override
-  public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsFunction x, JsContext ctx) {
     pushScope(x.getScope());
     return true;
   }
 
   @Override
-  public boolean visit(JsProgram x, JsContext<JsProgram> ctx) {
+  public boolean visit(JsProgram x, JsContext ctx) {
     pushScope(x.getScope());
     return true;
   }
@@ -80,7 +79,7 @@
   }
 
   protected abstract void resolve(JsNameRef x);
-  
+
   private void popScope() {
     scopeStack.pop();
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/JsBreakUpLargeVarStatements.java b/dev/core/src/com/google/gwt/dev/js/JsBreakUpLargeVarStatements.java
index 39b4132..938928b 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsBreakUpLargeVarStatements.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsBreakUpLargeVarStatements.java
@@ -22,7 +22,6 @@
 import com.google.gwt.dev.js.ast.JsContext;
 import com.google.gwt.dev.js.ast.JsModVisitor;
 import com.google.gwt.dev.js.ast.JsProgram;
-import com.google.gwt.dev.js.ast.JsStatement;
 import com.google.gwt.dev.js.ast.JsVars;
 import com.google.gwt.dev.js.ast.JsVars.JsVar;
 
@@ -31,7 +30,7 @@
 
 /**
  * Divides large var statements into smaller ones. Very long var statements have
- * trouble on some browsers, including the initial Safari 4 beta.  See Issue
+ * trouble on some browsers, including the initial Safari 4 beta. See Issue
  * 3455.
  */
 public class JsBreakUpLargeVarStatements extends JsModVisitor {
@@ -52,7 +51,7 @@
   }
 
   @Override
-  public void endVisit(JsVars x, JsContext<JsStatement> context) {
+  public void endVisit(JsVars x, JsContext context) {
     if (maxVarsPerStatement < 0) {
       return;
     }
diff --git a/dev/core/src/com/google/gwt/dev/js/JsCoerceIntShift.java b/dev/core/src/com/google/gwt/dev/js/JsCoerceIntShift.java
index 9ede191..631ff92 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsCoerceIntShift.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsCoerceIntShift.java
@@ -30,10 +30,10 @@
 import com.google.gwt.dev.js.ast.JsUnaryOperator;
 
 /**
- * Coerces lhs of right shift operations to int.  Necessary for Safari 5 bug
+ * Coerces lhs of right shift operations to int. Necessary for Safari 5 bug
  * https://bugs.webkit.org/show_bug.cgi?id=40367 fixed in
  * http://trac.webkit.org/changeset/60990 -- this should be removed once that
- * fix has been pushed. 
+ * fix has been pushed.
  */
 public class JsCoerceIntShift {
   // TODO(jat): remove this once Safari 5 has the update
@@ -44,18 +44,18 @@
   private static class MyVisitor extends JsModVisitor {
 
     @Override
-    public void endVisit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsBinaryOperation x, JsContext ctx) {
       JsBinaryOperator op = x.getOperator();
       if (op != JsBinaryOperator.SHR && op != JsBinaryOperator.SHRU) {
         return;
       }
-      
+
       SourceInfo sourceInfo = x.getSourceInfo();
       JsExpression lhs = x.getArg1();
       JsExpression rhs = x.getArg2();
       JsExpression newNode = new JsBinaryOperation(sourceInfo, op,
           new JsPrefixOperation(sourceInfo, JsUnaryOperator.BIT_NOT,
-          new JsPrefixOperation(sourceInfo, JsUnaryOperator.BIT_NOT, lhs)),
+              new JsPrefixOperation(sourceInfo, JsUnaryOperator.BIT_NOT, lhs)),
           rhs);
       ctx.replaceMe(newNode);
     }
diff --git a/dev/core/src/com/google/gwt/dev/js/JsConstructExpressionVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsConstructExpressionVisitor.java
index 5cd7e73..6d133cc 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsConstructExpressionVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsConstructExpressionVisitor.java
@@ -51,7 +51,7 @@
    * We only look at the array expression since the index has its own scope.
    */
   @Override
-  public boolean visit(JsArrayAccess x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsArrayAccess x, JsContext ctx) {
     accept(x.getArrayExpr());
     return false;
   }
@@ -60,7 +60,7 @@
    * Array literals have their own scoping.
    */
   @Override
-  public boolean visit(JsArrayLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsArrayLiteral x, JsContext ctx) {
     return false;
   }
 
@@ -68,18 +68,18 @@
    * Functions have their own scoping.
    */
   @Override
-  public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsFunction x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsInvocation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsInvocation x, JsContext ctx) {
     containsInvocation = true;
     return false;
   }
 
   @Override
-  public boolean visit(JsNameRef x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNameRef x, JsContext ctx) {
     if (!x.isLeaf()) {
       accept(x.getQualifier());
     }
@@ -90,7 +90,7 @@
    * New constructs bind to the nearest set of parentheses.
    */
   @Override
-  public boolean visit(JsNew x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNew x, JsContext ctx) {
     return false;
   }
 
@@ -98,7 +98,7 @@
    * Object literals have their own scope.
    */
   @Override
-  public boolean visit(JsObjectLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsObjectLiteral x, JsContext ctx) {
     return false;
   }
 
@@ -106,8 +106,8 @@
    * We only look at nodes that would not normally be surrounded by parentheses.
    */
   @SuppressWarnings("cast")
-    @Override
-  protected <T extends JsVisitable<T>> T doAccept(T node) {
+  @Override
+  protected <T extends JsVisitable> T doAccept(T node) {
     /*
      * Extra casts to Object to prevent 'inconvertible types' compile errors due
      * to http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6548436
diff --git a/dev/core/src/com/google/gwt/dev/js/JsDuplicateCaseFolder.java b/dev/core/src/com/google/gwt/dev/js/JsDuplicateCaseFolder.java
index 397894d..bbe8fe7 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsDuplicateCaseFolder.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsDuplicateCaseFolder.java
@@ -32,9 +32,9 @@
  * Combine case labels with identical bodies. Case bodies that may fall through
  * to the following case label and case bodies following a possible fallthrough
  * are left undisturbed.
- *
+ * 
  * For example, consider the following input:
- *
+ * 
  * <pre>
  * switch (x) {
  *   case 0: y = 17; break;
@@ -46,9 +46,9 @@
  *   case 6: return 22;
  * }
  * </pre>
- *
+ * 
  * This will be transformed into:
- *
+ * 
  * <pre>
  * switch (x) {
  *   case 0: y = 17; break;
@@ -57,7 +57,7 @@
  *   case 3: if (z == 0) { y = 18; break; } else { y = 19 }
  *   case 5: case 4: y = 17; break;
  * }
- *
+ * 
  * <pre>
  *
  * Cases (2, 6) and (4, 5) have been coalesced.  Note that case 0 has not been
@@ -76,7 +76,7 @@
     }
 
     @Override
-    public boolean visit(JsSwitch x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsSwitch x, JsContext ctx) {
       boolean modified = false;
 
       // A map from case body source code to the original case label
diff --git a/dev/core/src/com/google/gwt/dev/js/JsDuplicateFunctionRemover.java b/dev/core/src/com/google/gwt/dev/js/JsDuplicateFunctionRemover.java
index 93c8972..845ba4f 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsDuplicateFunctionRemover.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsDuplicateFunctionRemover.java
@@ -17,7 +17,6 @@
 
 import com.google.gwt.dev.js.ast.JsBlock;
 import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsFunction;
 import com.google.gwt.dev.js.ast.JsInvocation;
 import com.google.gwt.dev.js.ast.JsModVisitor;
@@ -57,19 +56,19 @@
     }
 
     @Override
-    public void endVisit(JsInvocation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsInvocation x, JsContext ctx) {
       if (x.getQualifier() instanceof JsNameRef) {
         invocationQualifiers.pop();
       }
     }
 
     @Override
-    public void endVisit(JsNameOf x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameOf x, JsContext ctx) {
       dontReplace.add(x.getName());
     }
 
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       if (x != invocationQualifiers.peek()) {
         if (x.getName() != null) {
           dontReplace.add(x.getName());
@@ -86,7 +85,7 @@
     }
 
     @Override
-    public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsFunction x, JsContext ctx) {
       /*
        * Don't process anonymous functions.
        */
@@ -104,7 +103,7 @@
     }
 
     @Override
-    public boolean visit(JsInvocation x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsInvocation x, JsContext ctx) {
       if (x.getQualifier() instanceof JsNameRef) {
         invocationQualifiers.push((JsNameRef) x.getQualifier());
       }
@@ -125,7 +124,7 @@
     }
 
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       JsName orig = duplicateMap.get(x.getName());
       if (orig != null && x.getName() != null
           && x.getName().getEnclosing() == program.getScope()
diff --git a/dev/core/src/com/google/gwt/dev/js/JsFirstExpressionVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsFirstExpressionVisitor.java
index 04e6860..ce86371 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsFirstExpressionVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsFirstExpressionVisitor.java
@@ -74,42 +74,42 @@
   }
 
   @Override
-  public boolean visit(JsArrayAccess x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsArrayAccess x, JsContext ctx) {
     accept(x.getArrayExpr());
     return false;
   }
 
   @Override
-  public boolean visit(JsArrayLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsArrayLiteral x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsBinaryOperation x, JsContext ctx) {
     accept(x.getArg1());
     return false;
   }
 
   @Override
-  public boolean visit(JsConditional x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsConditional x, JsContext ctx) {
     accept(x.getTestExpression());
     return false;
   }
 
   @Override
-  public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsFunction x, JsContext ctx) {
     needsParentheses = true;
     return false;
   }
 
   @Override
-  public boolean visit(JsInvocation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsInvocation x, JsContext ctx) {
     accept(x.getQualifier());
     return false;
   }
 
   @Override
-  public boolean visit(JsNameRef x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNameRef x, JsContext ctx) {
     if (!x.isLeaf()) {
       accept(x.getQualifier());
     }
@@ -117,29 +117,29 @@
   }
 
   @Override
-  public boolean visit(JsNew x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNew x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsObjectLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsObjectLiteral x, JsContext ctx) {
     needsParentheses = true;
     return false;
   }
 
   @Override
-  public boolean visit(JsPostfixOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsPostfixOperation x, JsContext ctx) {
     accept(x.getArg());
     return false;
   }
 
   @Override
-  public boolean visit(JsPrefixOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsPrefixOperation x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsRegExp x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsRegExp x, JsContext ctx) {
     return false;
   }
 }
diff --git a/dev/core/src/com/google/gwt/dev/js/JsHoister.java b/dev/core/src/com/google/gwt/dev/js/JsHoister.java
index 28cefe8..2917644 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsHoister.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsHoister.java
@@ -61,7 +61,7 @@
     private boolean successful = true;
 
     @Override
-    public void endVisit(JsArrayAccess x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsArrayAccess x, JsContext ctx) {
       JsArrayAccess newExpression = new JsArrayAccess(x.getSourceInfo());
       newExpression.setIndexExpr(stack.pop());
       newExpression.setArrayExpr(stack.pop());
@@ -69,7 +69,7 @@
     }
 
     @Override
-    public void endVisit(JsArrayLiteral x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsArrayLiteral x, JsContext ctx) {
       JsArrayLiteral toReturn = new JsArrayLiteral(x.getSourceInfo());
       List<JsExpression> expressions = toReturn.getExpressions();
       int size = x.getExpressions().size();
@@ -80,7 +80,7 @@
     }
 
     @Override
-    public void endVisit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsBinaryOperation x, JsContext ctx) {
       JsBinaryOperation toReturn = new JsBinaryOperation(x.getSourceInfo(),
           x.getOperator());
       toReturn.setArg2(stack.pop());
@@ -89,12 +89,12 @@
     }
 
     @Override
-    public void endVisit(JsBooleanLiteral x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsBooleanLiteral x, JsContext ctx) {
       stack.push(x);
     }
 
     @Override
-    public void endVisit(JsConditional x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsConditional x, JsContext ctx) {
       JsConditional toReturn = new JsConditional(x.getSourceInfo());
       toReturn.setElseExpression(stack.pop());
       toReturn.setThenExpression(stack.pop());
@@ -107,7 +107,7 @@
      * first-class objects.
      */
     @Override
-    public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsFunction x, JsContext ctx) {
       // Set a flag to indicate that we cannot continue, and push a null so
       // we don't run out of elements on the stack.
       successful = false;
@@ -119,7 +119,7 @@
      * sites.
      */
     @Override
-    public void endVisit(JsInvocation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsInvocation x, JsContext ctx) {
       JsInvocation toReturn = new JsInvocation(x.getSourceInfo());
       List<JsExpression> params = toReturn.getArguments();
       int size = x.getArguments().size();
@@ -131,7 +131,7 @@
     }
 
     @Override
-    public void endVisit(JsNameOf x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameOf x, JsContext ctx) {
       JsNameOf toReturn = new JsNameOf(x.getSourceInfo(), x.getName());
       stack.push(toReturn);
     }
@@ -142,7 +142,7 @@
      * re-writing an invocation.
      */
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       JsNameRef toReturn = new JsNameRef(x.getSourceInfo(), x.getName());
 
       if (x.getQualifier() != null) {
@@ -152,7 +152,7 @@
     }
 
     @Override
-    public void endVisit(JsNew x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNew x, JsContext ctx) {
       int size = x.getArguments().size();
       List<JsExpression> arguments = new ArrayList<JsExpression>(size);
       while (size-- > 0) {
@@ -164,17 +164,17 @@
     }
 
     @Override
-    public void endVisit(JsNullLiteral x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNullLiteral x, JsContext ctx) {
       stack.push(x);
     }
 
     @Override
-    public void endVisit(JsNumberLiteral x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNumberLiteral x, JsContext ctx) {
       stack.push(x);
     }
 
     @Override
-    public void endVisit(JsObjectLiteral x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsObjectLiteral x, JsContext ctx) {
       JsObjectLiteral toReturn = new JsObjectLiteral(x.getSourceInfo());
       List<JsPropertyInitializer> inits = toReturn.getPropertyInitializers();
 
@@ -197,7 +197,7 @@
     }
 
     @Override
-    public void endVisit(JsPostfixOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsPostfixOperation x, JsContext ctx) {
       JsPostfixOperation toReturn = new JsPostfixOperation(x.getSourceInfo(),
           x.getOperator());
       toReturn.setArg(stack.pop());
@@ -205,7 +205,7 @@
     }
 
     @Override
-    public void endVisit(JsPrefixOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsPrefixOperation x, JsContext ctx) {
       JsPrefixOperation toReturn = new JsPrefixOperation(x.getSourceInfo(),
           x.getOperator());
       toReturn.setArg(stack.pop());
@@ -213,17 +213,17 @@
     }
 
     @Override
-    public void endVisit(JsRegExp x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsRegExp x, JsContext ctx) {
       stack.push(x);
     }
 
     @Override
-    public void endVisit(JsStringLiteral x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsStringLiteral x, JsContext ctx) {
       stack.push(x);
     }
 
     @Override
-    public void endVisit(JsThisRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsThisRef x, JsContext ctx) {
       stack.push(new JsThisRef(x.getSourceInfo()));
     }
 
diff --git a/dev/core/src/com/google/gwt/dev/js/JsIEBlockSizeVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsIEBlockSizeVisitor.java
index 8ff10c1..55226f7 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsIEBlockSizeVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsIEBlockSizeVisitor.java
@@ -22,7 +22,6 @@
 import com.google.gwt.dev.js.ast.JsDefault;
 import com.google.gwt.dev.js.ast.JsProgram;
 import com.google.gwt.dev.js.ast.JsStatement;
-import com.google.gwt.dev.js.ast.JsSwitchMember;
 import com.google.gwt.dev.js.ast.JsVisitor;
 
 import java.util.List;
@@ -33,7 +32,7 @@
  * within a JsBlock. This visitor will restructure blocks and other block-like
  * structures with too many statements in order to reduce the total number of
  * statements that appear within any given block to fewer than
- * {@value #MAX_BLOCK_SIZE} statements by creating nested blocks:  
+ * {@value #MAX_BLOCK_SIZE} statements by creating nested blocks:
  * 
  * <pre>
  * {
@@ -59,7 +58,7 @@
     }
 
     @Override
-    public void endVisit(JsBlock x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsBlock x, JsContext ctx) {
       // JsFunctionClusterer handles restructuring top-level statement blocks
       if (!x.isGlobalBlock()) {
         restructure(x.getStatements());
@@ -67,12 +66,12 @@
     }
 
     @Override
-    public void endVisit(JsCase x, JsContext<JsSwitchMember> ctx) {
+    public void endVisit(JsCase x, JsContext ctx) {
       restructure(x.getStmts());
     }
 
     @Override
-    public void endVisit(JsDefault x, JsContext<JsSwitchMember> ctx) {
+    public void endVisit(JsDefault x, JsContext ctx) {
       restructure(x.getStmts());
     }
 
diff --git a/dev/core/src/com/google/gwt/dev/js/JsInliner.java b/dev/core/src/com/google/gwt/dev/js/JsInliner.java
index 2469762..55ab2fc 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsInliner.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsInliner.java
@@ -54,7 +54,6 @@
 import com.google.gwt.dev.js.ast.JsScope;
 import com.google.gwt.dev.js.ast.JsStatement;
 import com.google.gwt.dev.js.ast.JsStringLiteral;
-import com.google.gwt.dev.js.ast.JsSwitchMember;
 import com.google.gwt.dev.js.ast.JsThisRef;
 import com.google.gwt.dev.js.ast.JsVars;
 import com.google.gwt.dev.js.ast.JsVars.JsVar;
@@ -103,17 +102,17 @@
     }
 
     @Override
-    public void endVisit(JsArrayLiteral x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsArrayLiteral x, JsContext ctx) {
       affectedBySideEffects = true;
     }
 
     @Override
-    public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsFunction x, JsContext ctx) {
       affectedBySideEffects = true;
     }
 
     @Override
-    public void endVisit(JsInvocation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsInvocation x, JsContext ctx) {
       /*
        * We could make this more accurate by analyzing the function that's being
        * executed, but we'll bank on subsequent passes inlining simple function
@@ -123,7 +122,7 @@
     }
 
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       if (x.getQualifier() == null && x.getName() != null) {
         // Special case the undefined literal.
         if (x.getName() == program.getUndefinedLiteral().getName()) {
@@ -143,7 +142,7 @@
     }
 
     @Override
-    public void endVisit(JsObjectLiteral x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsObjectLiteral x, JsContext ctx) {
       affectedBySideEffects = true;
     }
   }
@@ -183,7 +182,7 @@
     }
 
     @Override
-    public void endVisit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsBinaryOperation x, JsContext ctx) {
       if (isComma(x) == null) {
         return;
       }
@@ -280,87 +279,87 @@
     private int complexity = 0;
 
     @Override
-    public void endVisit(JsArrayAccess x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsArrayAccess x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsArrayLiteral x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsArrayLiteral x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsBinaryOperation x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsBooleanLiteral x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsBooleanLiteral x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsConditional x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsConditional x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsFunction x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsInvocation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsInvocation x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsNew x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNew x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsNullLiteral x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNullLiteral x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsNumberLiteral x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNumberLiteral x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsObjectLiteral x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsObjectLiteral x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsPostfixOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsPostfixOperation x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsPrefixOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsPrefixOperation x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsRegExp x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsRegExp x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsStringLiteral x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsStringLiteral x, JsContext ctx) {
       complexity++;
     }
 
     @Override
-    public void endVisit(JsThisRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsThisRef x, JsContext ctx) {
       complexity++;
     }
 
@@ -406,7 +405,7 @@
      * conditional-evaluation case of logical and/or operations.
      */
     @Override
-    public boolean visit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsBinaryOperation x, JsContext ctx) {
       if (x.getOperator() == JsBinaryOperator.COMMA) {
 
         boolean left = isDuplicateCall(x.getArg1());
@@ -458,20 +457,20 @@
      * subtypes.
      */
     @Override
-    public boolean visit(JsBlock x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsBlock x, JsContext ctx) {
       branch(x.getStatements());
       return false;
     }
 
     @Override
-    public boolean visit(JsCase x, JsContext<JsSwitchMember> ctx) {
+    public boolean visit(JsCase x, JsContext ctx) {
       x.setCaseExpr(accept(x.getCaseExpr()));
       branch(x.getStmts());
       return false;
     }
 
     @Override
-    public boolean visit(JsConditional x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsConditional x, JsContext ctx) {
       x.setTestExpression(accept(x.getTestExpression()));
       x.setThenExpression(branch(x.getThenExpression()));
       x.setElseExpression(branch(x.getElseExpression()));
@@ -479,13 +478,13 @@
     }
 
     @Override
-    public boolean visit(JsDefault x, JsContext<JsSwitchMember> ctx) {
+    public boolean visit(JsDefault x, JsContext ctx) {
       branch(x.getStmts());
       return false;
     }
 
     @Override
-    public boolean visit(JsExprStmt x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsExprStmt x, JsContext ctx) {
       if (isDuplicateCall(x.getExpression())) {
         if (ctx.canRemove()) {
           ctx.removeMe();
@@ -500,7 +499,7 @@
     }
 
     @Override
-    public boolean visit(JsFor x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsFor x, JsContext ctx) {
       // The JsFor may have an expression xor a variable declaration.
       if (x.getInitExpr() != null) {
         x.setInitExpr(accept(x.getInitExpr()));
@@ -524,7 +523,7 @@
     }
 
     @Override
-    public boolean visit(JsForIn x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsForIn x, JsContext ctx) {
       if (x.getIterExpr() != null) {
         x.setIterExpr(accept(x.getIterExpr()));
       }
@@ -537,7 +536,7 @@
     }
 
     @Override
-    public boolean visit(JsIf x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsIf x, JsContext ctx) {
       x.setIfExpr(accept(x.getIfExpr()));
 
       x.setThenStmt(branch(x.getThenStmt()));
@@ -552,7 +551,7 @@
      * Possibly record that we've seen a call in the current context.
      */
     @Override
-    public boolean visit(JsInvocation x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsInvocation x, JsContext ctx) {
       JsFunction func = isExecuteOnce(x);
       while (func != null) {
         called.add(func);
@@ -562,7 +561,7 @@
     }
 
     @Override
-    public boolean visit(JsWhile x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsWhile x, JsContext ctx) {
       x.setCondition(accept(x.getCondition()));
 
       // The body is not guaranteed to be a JsBlock
@@ -570,13 +569,13 @@
       return false;
     }
 
-    private <T extends JsNode<T>> void branch(List<T> x) {
+    private <T extends JsNode> void branch(List<T> x) {
       DuplicateXORemover dup = new DuplicateXORemover(program, called);
       dup.acceptWithInsertRemove(x);
       didChange |= dup.didChange();
     }
 
-    private <T extends JsNode<T>> T branch(T x) {
+    private <T extends JsNode> T branch(T x) {
       DuplicateXORemover dup = new DuplicateXORemover(program, called);
       T toReturn = dup.accept(x);
 
@@ -618,7 +617,7 @@
     }
 
     @Override
-    public void endVisit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsBinaryOperation x, JsContext ctx) {
       JsBinaryOperator op = x.getOperator();
 
       /*
@@ -639,7 +638,7 @@
      * don't allow inlining.
      */
     @Override
-    public void endVisit(JsConditional x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsConditional x, JsContext ctx) {
       boolean thenStrict = refersToRequiredName(x.getThenExpression());
       boolean elseStrict = refersToRequiredName(x.getElseExpression());
 
@@ -654,7 +653,7 @@
      * just ignore them.
      */
     @Override
-    public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsFunction x, JsContext ctx) {
       maintainsOrder = false;
     }
 
@@ -668,7 +667,7 @@
      * nested invocation.
      */
     @Override
-    public void endVisit(JsInvocation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsInvocation x, JsContext ctx) {
       /*
        * The check for isExecuteOnce() is potentially incorrect here, however
        * the original Java semantics of the clinit would have made the code
@@ -678,23 +677,21 @@
         maintainsOrder = false;
       }
     }
-    
+
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       checkName(x.getName());
     }
 
     @Override
-    public void endVisit(JsNew x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNew x, JsContext ctx) {
       /*
-       * Unless all arguments have already been evaluated, assume
-       * that invoking the new expression might interfere with
-       * the evaluation of the argument.
-       *
-       * It would be possible to allow this if the invoked function
-       * either does nothing or does nothing that affects the 
-       * remaining arguments.  However, currently there is no
-       * analysis of the invoked function.
+       * Unless all arguments have already been evaluated, assume that invoking
+       * the new expression might interfere with the evaluation of the argument.
+       * 
+       * It would be possible to allow this if the invoked function either does
+       * nothing or does nothing that affects the remaining arguments. However,
+       * currently there is no analysis of the invoked function.
        */
       if (unevaluated.size() > 0) {
         maintainsOrder = false;
@@ -702,7 +699,7 @@
     }
 
     @Override
-    public void endVisit(JsThisRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsThisRef x, JsContext ctx) {
       checkName(THIS_NAME);
     }
 
@@ -743,7 +740,7 @@
     }
 
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       boolean hasQualifier = x.getQualifier() != null;
 
       if ((collectQualified && !hasQualifier)
@@ -811,7 +808,7 @@
      * removes statements with no side-effects.
      */
     @Override
-    public void endVisit(JsExprStmt x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsExprStmt x, JsContext ctx) {
       JsExpression e = x.getExpression();
 
       // We will occasionally create JsExprStmts that have no side-effects.
@@ -889,7 +886,7 @@
     }
 
     @Override
-    public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsFunction x, JsContext ctx) {
       if (!functionStack.pop().equals(x)) {
         throw new InternalCompilerException("Unexpected function popped");
       }
@@ -901,7 +898,7 @@
     }
 
     @Override
-    public void endVisit(JsInvocation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsInvocation x, JsContext ctx) {
       if (functionStack.isEmpty()) {
         return;
       }
@@ -972,7 +969,7 @@
     }
 
     @Override
-    public void endVisit(JsProgramFragment x, JsContext<JsProgramFragment> ctx) {
+    public void endVisit(JsProgramFragment x, JsContext ctx) {
       if (!functionStack.pop().equals(programFunction)) {
         throw new InternalCompilerException("Unexpected function popped");
       }
@@ -984,7 +981,7 @@
     }
 
     @Override
-    public boolean visit(JsExprStmt x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsExprStmt x, JsContext ctx) {
       if (functionStack.peek() == programFunction) {
         /* Don't inline top-level invocations. */
         if (x.getExpression() instanceof JsInvocation) {
@@ -995,7 +992,7 @@
     }
 
     @Override
-    public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsFunction x, JsContext ctx) {
       functionStack.push(x);
       newLocalVariableStack.push(new ArrayList<JsName>());
       return true;
@@ -1006,7 +1003,7 @@
      * top-level of the program.
      */
     @Override
-    public boolean visit(JsProgramFragment x, JsContext<JsProgramFragment> ctx) {
+    public boolean visit(JsProgramFragment x, JsContext ctx) {
       programFunction = new JsFunction(program.getSourceInfo(),
           program.getScope());
       programFunction.setBody(new JsBlock(x.getSourceInfo()));
@@ -1222,12 +1219,12 @@
     private final Map<JsFunction, Integer> invocationCount = new IdentityHashMap<JsFunction, Integer>();
 
     @Override
-    public void endVisit(JsInvocation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsInvocation x, JsContext ctx) {
       checkFunctionCall(x.getQualifier());
     }
 
     @Override
-    public void endVisit(JsNew x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNew x, JsContext ctx) {
       checkFunctionCall(x.getConstructorExpression());
     }
 
@@ -1306,7 +1303,7 @@
      * into the function invocation.
      */
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       if (x.getQualifier() != null) {
         return;
       }
@@ -1321,7 +1318,7 @@
     }
 
     @Override
-    public void endVisit(JsThisRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsThisRef x, JsContext ctx) {
       assert thisExpr != null;
       ctx.replaceMe(thisExpr);
     }
@@ -1374,7 +1371,7 @@
     }
 
     @Override
-    public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsFunction x, JsContext ctx) {
       containsNestedFunctions = true;
     }
   }
@@ -1396,14 +1393,14 @@
     }
 
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       if (ctx.isLvalue() && isParameter(x)) {
         violation = true;
       }
     }
 
     @Override
-    public void endVisit(JsThisRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsThisRef x, JsContext ctx) {
       if (!hasThisExpr) {
         violation = true;
       }
@@ -1437,14 +1434,14 @@
     private final Set<JsFunction> recursive = new HashSet<JsFunction>();
 
     @Override
-    public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsFunction x, JsContext ctx) {
       if (!functionStack.pop().equals(x)) {
         throw new InternalCompilerException("Unexpected function popped");
       }
     }
 
     @Override
-    public void endVisit(JsInvocation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsInvocation x, JsContext ctx) {
       /*
        * Because functions can encapsulate other functions, we look at the
        * entire stack and not just the top element. This would prevent inlining
@@ -1464,7 +1461,7 @@
     }
 
     @Override
-    public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsFunction x, JsContext ctx) {
       functionStack.push(x);
       return true;
     }
@@ -1484,7 +1481,7 @@
      * Look for assignments to JsNames whose static references are JsFunctions.
      */
     @Override
-    public void endVisit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsBinaryOperation x, JsContext ctx) {
 
       if (!x.getOperator().equals(JsBinaryOperator.ASG)) {
         return;
@@ -1501,7 +1498,7 @@
      * existing function.
      */
     @Override
-    public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsFunction x, JsContext ctx) {
       JsName name = x.getName();
 
       if (name == null) {
@@ -1539,7 +1536,7 @@
     }
 
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       JsName name = x.getName();
 
       if (name == null) {
@@ -1577,7 +1574,7 @@
     }
 
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       /*
        * We can ignore qualified reference, since their scope is always that of
        * the qualifier.
@@ -1627,8 +1624,8 @@
    * Static entry point used by JavaToJavaScriptCompiler.
    */
   public static OptimizerStats exec(JsProgram program) {
-    Event optimizeJsEvent = SpeedTracerLogger.start(CompilerEventType.OPTIMIZE_JS, 
-        "optimizer", NAME);
+    Event optimizeJsEvent = SpeedTracerLogger.start(
+        CompilerEventType.OPTIMIZE_JS, "optimizer", NAME);
     OptimizerStats stats = execImpl(program);
     optimizeJsEvent.end("didChange", "" + stats.didChange());
     return stats;
@@ -1658,7 +1655,7 @@
   /**
    * Generate an estimated measure of the syntactic complexity of a JsNode.
    */
-  private static int complexity(JsNode<?> toEstimate) {
+  private static int complexity(JsNode toEstimate) {
     ComplexityEstimator e = new ComplexityEstimator();
     e.accept(toEstimate);
     return e.getComplexity();
@@ -1708,7 +1705,7 @@
    * that refer to function parameters.
    */
   private static boolean hasCommonIdents(List<JsExpression> arguments,
-      JsNode<?> toInline, Collection<String> parameterIdents) {
+      JsNode toInline, Collection<String> parameterIdents) {
 
     // This is a fire-twice loop
     boolean checkQualified = false;
@@ -1833,8 +1830,6 @@
    * Given an expression, determine if it it is a JsNameRef that refers to a
    * statically-defined JsFunction.
    */
-  // Javac 1.6.0_01 barfs if staticRef is a JsNode<?>
-  @SuppressWarnings("unchecked")
   private static JsFunction isFunction(JsExpression e) {
     if (e instanceof JsNameRef) {
       JsNameRef ref = (JsNameRef) e;
@@ -1860,7 +1855,7 @@
    */
   private static boolean isInlinable(JsProgram program, JsFunction caller,
       JsFunction callee, JsExpression thisExpr, List<JsExpression> arguments,
-      JsNode<?> toInline) {
+      JsNode toInline) {
 
     /*
      * This will happen with varargs-style JavaScript functions that rely on the
diff --git a/dev/core/src/com/google/gwt/dev/js/JsKeywords.java b/dev/core/src/com/google/gwt/dev/js/JsKeywords.java
index e830b0b..69afdcf 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsKeywords.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsKeywords.java
@@ -34,7 +34,7 @@
   }
 
   private static synchronized void initJavaScriptKeywords() {
-    String[] keywords = new String[] {
+    String[] keywords = new String[]{
         // These are current keywords
         //
         "break", "delete", "function", "return", "typeof", "case", "do", "if",
diff --git a/dev/core/src/com/google/gwt/dev/js/JsNormalizer.java b/dev/core/src/com/google/gwt/dev/js/JsNormalizer.java
index 32bfc94..f7999e2 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsNormalizer.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsNormalizer.java
@@ -30,9 +30,8 @@
  * Fixes any semantic errors introduced by JS AST gen.
  * 
  * <ul>
- * <li> Creating clinit calls can put comma expressions as lvalues; the
- * modifying operation must be moved inside the comma expression to the last
- * argument. </li>
+ * <li>Creating clinit calls can put comma expressions as lvalues; the modifying
+ * operation must be moved inside the comma expression to the last argument.</li>
  * </ul>
  */
 public class JsNormalizer {
@@ -43,17 +42,17 @@
   private static class JsNormalizing extends JsModVisitor {
 
     @Override
-    public void endVisit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsBinaryOperation x, JsContext ctx) {
       maybeShuffleModifyingBinary(x, ctx);
     }
 
     @Override
-    public void endVisit(JsPostfixOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsPostfixOperation x, JsContext ctx) {
       maybeShuffleModifyingUnary(x, ctx);
     }
 
     @Override
-    public void endVisit(JsPrefixOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsPrefixOperation x, JsContext ctx) {
       maybeShuffleModifyingUnary(x, ctx);
     }
 
@@ -62,8 +61,7 @@
      * operation as the argument to a modifying operation, which is illegal.
      * Juggle things to put the operator inside of the comma expression.
      */
-    private void maybeShuffleModifyingBinary(JsBinaryOperation x,
-        JsContext<JsExpression> ctx) {
+    private void maybeShuffleModifyingBinary(JsBinaryOperation x, JsContext ctx) {
       JsBinaryOperator myOp = x.getOperator();
       JsExpression lhs = x.getArg1();
 
@@ -88,8 +86,7 @@
      * operation as the argument to a modifying operation, which is illegal.
      * Juggle things to put the operator inside of the comma expression.
      */
-    private void maybeShuffleModifyingUnary(JsUnaryOperation x,
-        JsContext<JsExpression> ctx) {
+    private void maybeShuffleModifyingUnary(JsUnaryOperation x, JsContext ctx) {
       JsUnaryOperator myOp = x.getOperator();
       JsExpression arg = x.getArg();
       if (myOp.isModifying() && (arg instanceof JsBinaryOperation)) {
diff --git a/dev/core/src/com/google/gwt/dev/js/JsObfuscateNamer.java b/dev/core/src/com/google/gwt/dev/js/JsObfuscateNamer.java
index 7ff5f6b..90f125e 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsObfuscateNamer.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsObfuscateNamer.java
@@ -32,13 +32,13 @@
   /**
    * A lookup table of base-64 chars we use to encode idents.
    */
-  private static final char[] sBase64Chars = new char[] {
+  private static final char[] sBase64Chars = new char[]{
       'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
       'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B',
       'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
       'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '$', '_', '0', '1',
       '2', '3', '4', '5', '6', '7', '8', '9'};
-      
+
   public static void exec(JsProgram program) {
     new JsObfuscateNamer(program).execImpl();
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/JsParser.java b/dev/core/src/com/google/gwt/dev/js/JsParser.java
index 8e4eb19..f1bdb2d 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsParser.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsParser.java
@@ -160,7 +160,7 @@
     return toReturn;
   }
 
-  private JsNode<?> map(Node node) throws JsParserException {
+  private JsNode map(Node node) throws JsParserException {
 
     switch (node.getType()) {
       case TokenStream.SCRIPT: {
@@ -237,8 +237,9 @@
         return mapConditional(node);
 
       case TokenStream.STRING:
-        return program.getStringLiteral(sourceInfoStack.peek().makeChild(
-            JsParser.class, "JS String literal"), node.getString());
+        return program.getStringLiteral(
+            sourceInfoStack.peek().makeChild(JsParser.class,
+                "JS String literal"), node.getString());
 
       case TokenStream.NUMBER:
         return mapNumber(node);
@@ -350,8 +351,6 @@
    */
   private JsNameRef mapAsPropertyNameRef(Node nameRefNode)
       throws JsParserException {
-    // Javac 1.6.0_01 doesn't like the cast below if this is parameterized
-    @SuppressWarnings("unchecked")
     JsNode unknown = map(nameRefNode);
     // This is weird, but for "a.b", the rhino AST calls "b" a string literal.
     // However, since we know it's for a PROPGET, we can unstringliteralize it.
@@ -577,8 +576,6 @@
   }
 
   private JsExpression mapExpression(Node exprNode) throws JsParserException {
-    // Javac 1.6.0_01 doesn't like the cast below if this is parameterized
-    @SuppressWarnings("unchecked")
     JsNode unknown = map(exprNode);
     if (unknown instanceof JsExpression) {
       return (JsExpression) unknown;
@@ -646,8 +643,6 @@
       JsFor toFor = new JsFor(makeSourceInfo(forNode));
 
       // The first item is either an expression or a JsVars.
-      // Javac 1.6.0_01 doesn't like the cast below if this is parameterized
-      @SuppressWarnings("unchecked")
       JsNode initThingy = map(fromInit);
       if (initThingy != null) {
         if (initThingy instanceof JsVars) {
@@ -782,8 +777,8 @@
       case TokenStream.POST:
         return mapPostfixOperation(op, node);
       default:
-        throw createParserException("Unknown prefix/postfix variant: "
-            + node.getIntDatum(), node);
+        throw createParserException(
+            "Unknown prefix/postfix variant: " + node.getIntDatum(), node);
     }
   }
 
@@ -861,8 +856,6 @@
 
   private JsExpression mapOptionalExpression(Node exprNode)
       throws JsParserException {
-    // Javac 1.6.0_01 doesn't like the cast below if this is parameterized
-    @SuppressWarnings("unchecked")
     JsNode unknown = map(exprNode);
     if (unknown != null) {
       if (unknown instanceof JsExpression) {
@@ -911,7 +904,7 @@
     }
   }
 
-  private JsNode<?> mapRegExp(Node regExpNode) {
+  private JsNode mapRegExp(Node regExpNode) {
     JsRegExp toRegExp = new JsRegExp(makeSourceInfo(regExpNode));
 
     Node fromPattern = regExpNode.getFirstChild();
@@ -1012,8 +1005,6 @@
   }
 
   private JsStatement mapStatement(Node nodeStmt) throws JsParserException {
-    // Javac 1.6.0_01 doesn't like the cast below if this is parameterized
-    @SuppressWarnings("unchecked")
     JsNode unknown = map(nodeStmt);
     if (unknown != null) {
       if (unknown instanceof JsStatement) {
@@ -1201,8 +1192,8 @@
         return mapPrefixOperation(JsUnaryOperator.VOID, unOp);
 
       default:
-        throw createParserException("Unknown unary operator variant: "
-            + unOp.getIntDatum(), unOp);
+        throw createParserException(
+            "Unknown unary operator variant: " + unOp.getIntDatum(), unOp);
     }
   }
 
@@ -1234,7 +1225,7 @@
     return toVars;
   }
 
-  private JsNode<?> mapWithStatement(Node withNode) throws JsParserException {
+  private JsNode mapWithStatement(Node withNode) throws JsParserException {
     // The "with" statement is unsupported because it introduces ambiguity
     // related to whether or not a name is obfuscatable that we cannot resolve
     // statically. This is modified in our copy of the Rhino Parser to provide
diff --git a/dev/core/src/com/google/gwt/dev/js/JsPrecedenceVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsPrecedenceVisitor.java
index 36b7b6d..49bf02b 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsPrecedenceVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsPrecedenceVisitor.java
@@ -51,17 +51,15 @@
 import com.google.gwt.dev.js.ast.JsPropertyInitializer;
 import com.google.gwt.dev.js.ast.JsRegExp;
 import com.google.gwt.dev.js.ast.JsReturn;
-import com.google.gwt.dev.js.ast.JsStatement;
 import com.google.gwt.dev.js.ast.JsStringLiteral;
 import com.google.gwt.dev.js.ast.JsSwitch;
-import com.google.gwt.dev.js.ast.JsSwitchMember;
 import com.google.gwt.dev.js.ast.JsThisRef;
 import com.google.gwt.dev.js.ast.JsThrow;
 import com.google.gwt.dev.js.ast.JsTry;
 import com.google.gwt.dev.js.ast.JsVars;
+import com.google.gwt.dev.js.ast.JsVars.JsVar;
 import com.google.gwt.dev.js.ast.JsVisitor;
 import com.google.gwt.dev.js.ast.JsWhile;
-import com.google.gwt.dev.js.ast.JsVars.JsVar;
 
 /**
  * Precedence indices from "JavaScript - The Definitive Guide" 4th Edition (page
@@ -103,125 +101,125 @@
   }
 
   @Override
-  public boolean visit(JsArrayAccess x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsArrayAccess x, JsContext ctx) {
     answer = 16;
     return false;
   }
 
   @Override
-  public boolean visit(JsArrayLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsArrayLiteral x, JsContext ctx) {
     answer = 17; // primary
     return false;
   }
 
   @Override
-  public boolean visit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsBinaryOperation x, JsContext ctx) {
     answer = x.getOperator().getPrecedence();
     return false;
   }
 
   @Override
-  public boolean visit(JsBlock x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsBlock x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsBooleanLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsBooleanLiteral x, JsContext ctx) {
     answer = 17; // primary
     return false;
   }
 
   @Override
-  public boolean visit(JsBreak x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsBreak x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsCase x, JsContext<JsSwitchMember> ctx) {
+  public boolean visit(JsCase x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsCatch x, JsContext<JsCatch> ctx) {
+  public boolean visit(JsCatch x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsConditional x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsConditional x, JsContext ctx) {
     answer = 3;
     return false;
   }
 
   @Override
-  public boolean visit(JsContinue x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsContinue x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsDebugger x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsDebugger x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsDefault x, JsContext<JsSwitchMember> ctx) {
+  public boolean visit(JsDefault x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsDoWhile x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsDoWhile x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsEmpty x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsEmpty x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsExprStmt x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsExprStmt x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsFor x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsFor x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsForIn x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsForIn x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsFunction x, JsContext ctx) {
     answer = 17; // primary
     return false;
   }
 
   @Override
-  public boolean visit(JsIf x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsIf x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsInvocation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsInvocation x, JsContext ctx) {
     answer = 16;
     return false;
   }
 
   @Override
-  public boolean visit(JsLabel x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsLabel x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsNameOf x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNameOf x, JsContext ctx) {
     answer = 17; // Similar to string literal
     return false;
   }
 
   @Override
-  public boolean visit(JsNameRef x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNameRef x, JsContext ctx) {
     if (x.isLeaf()) {
       answer = 17; // primary
     } else {
@@ -231,108 +229,107 @@
   }
 
   @Override
-  public boolean visit(JsNew x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNew x, JsContext ctx) {
     answer = PRECEDENCE_NEW;
     return false;
   }
 
   @Override
-  public boolean visit(JsNullLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNullLiteral x, JsContext ctx) {
     answer = 17; // primary
     return false;
   }
 
   @Override
-  public boolean visit(JsNumberLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNumberLiteral x, JsContext ctx) {
     answer = 17; // primary
     return false;
   }
 
   @Override
-  public boolean visit(JsObjectLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsObjectLiteral x, JsContext ctx) {
     answer = 17; // primary
     return false;
   }
 
   @Override
-  public boolean visit(JsParameter x, JsContext<JsParameter> ctx) {
+  public boolean visit(JsParameter x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsPostfixOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsPostfixOperation x, JsContext ctx) {
     answer = x.getOperator().getPrecedence();
     return false;
   }
 
   @Override
-  public boolean visit(JsPrefixOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsPrefixOperation x, JsContext ctx) {
     answer = x.getOperator().getPrecedence();
     return false;
   }
 
   @Override
-  public boolean visit(JsProgram x, JsContext<JsProgram> ctx) {
+  public boolean visit(JsProgram x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsPropertyInitializer x,
-      JsContext<JsPropertyInitializer> ctx) {
+  public boolean visit(JsPropertyInitializer x, JsContext ctx) {
     answer = 17; // primary
     return false;
   }
 
   @Override
-  public boolean visit(JsRegExp x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsRegExp x, JsContext ctx) {
     answer = 17; // primary
     return false;
   }
 
   @Override
-  public boolean visit(JsReturn x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsReturn x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsStringLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsStringLiteral x, JsContext ctx) {
     answer = 17; // primary
     return false;
   }
 
   @Override
-  public boolean visit(JsSwitch x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsSwitch x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsThisRef x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsThisRef x, JsContext ctx) {
     answer = 17; // primary
     return false;
   }
 
   @Override
-  public boolean visit(JsThrow x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsThrow x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsTry x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsTry x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsVar x, JsContext<JsVar> ctx) {
+  public boolean visit(JsVar x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsVars x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsVars x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
   @Override
-  public boolean visit(JsWhile x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsWhile x, JsContext ctx) {
     throw new RuntimeException("Only expressions have precedence.");
   }
 
diff --git a/dev/core/src/com/google/gwt/dev/js/JsPrettyNamer.java b/dev/core/src/com/google/gwt/dev/js/JsPrettyNamer.java
index db47892..4019943 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsPrettyNamer.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsPrettyNamer.java
@@ -42,13 +42,12 @@
   private Set<String> childIdents = null;
 
   private final JsProgram program;
-  
+
   /**
-   * A map containing the next integer to try as an identifier suffix for
-   * a given JsScope.
+   * A map containing the next integer to try as an identifier suffix for a
+   * given JsScope.
    */
-  private IdentityHashMap<JsScope,HashMap<String,Integer>> startIdentForScope =
-    new IdentityHashMap<JsScope, HashMap<String,Integer>>();
+  private IdentityHashMap<JsScope, HashMap<String, Integer>> startIdentForScope = new IdentityHashMap<JsScope, HashMap<String, Integer>>();
 
   public JsPrettyNamer(JsProgram program) {
     this.program = program;
@@ -58,7 +57,8 @@
     visit(program.getRootScope());
   }
 
-  private boolean isLegal(JsScope scope, Set<String> childIdents, String newIdent) {
+  private boolean isLegal(JsScope scope, Set<String> childIdents,
+      String newIdent) {
     if (JsKeywords.isKeyword(newIdent)) {
       return false;
     }
@@ -75,12 +75,12 @@
   }
 
   private void visit(JsScope scope) {
-    HashMap<String,Integer> startIdent = startIdentForScope.get(scope);
+    HashMap<String, Integer> startIdent = startIdentForScope.get(scope);
     if (startIdent == null) {
-      startIdent = new HashMap<String,Integer>();
+      startIdent = new HashMap<String, Integer>();
       startIdentForScope.put(scope, startIdent);
     }
-    
+
     // Save off the childIdents which is currently being computed for my parent.
     Set<String> myChildIdents = childIdents;
 
@@ -111,7 +111,7 @@
       String newIdent = name.getShortIdent();
       if (!isLegal(scope, childIdents, newIdent)) {
         String checkIdent;
-        
+
         // Start searching using a suffix hint stored in the scope.
         // We still do a search in case there is a collision with
         // a user-provided identifier
diff --git a/dev/core/src/com/google/gwt/dev/js/JsReportGenerationVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsReportGenerationVisitor.java
index acfda17..8577578 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsReportGenerationVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsReportGenerationVisitor.java
@@ -31,7 +31,8 @@
  * A variation on the standard source generation visitor that records the
  * locations of SourceInfo objects in the output.
  */
-public class JsReportGenerationVisitor extends JsSourceGenerationVisitorWithSizeBreakdown {
+public class JsReportGenerationVisitor extends
+    JsSourceGenerationVisitorWithSizeBreakdown {
   private final Map<Range, SourceInfo> sourceInfoMap = new HashMap<Range, SourceInfo>();
   private final TextOutput out;
 
@@ -45,7 +46,7 @@
   }
 
   @Override
-  protected <T extends JsVisitable<T>> T doAccept(T node) {
+  protected <T extends JsVisitable> T doAccept(T node) {
     boolean addEntry = node instanceof HasSourceInfo;
     int start = addEntry ? out.getPosition() : 0;
     T toReturn = super.doAccept(node);
@@ -57,14 +58,14 @@
   }
 
   @Override
-  protected <T extends JsVisitable<T>> void doAcceptList(List<T> collection) {
+  protected <T extends JsVisitable> void doAcceptList(List<T> collection) {
     for (T t : collection) {
       doAccept(t);
     }
   }
 
   @Override
-  protected <T extends JsVisitable<T>> void doAcceptWithInsertRemove(
+  protected <T extends JsVisitable> void doAcceptWithInsertRemove(
       List<T> collection) {
     for (T t : collection) {
       doAccept(t);
diff --git a/dev/core/src/com/google/gwt/dev/js/JsRequiresSemiVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsRequiresSemiVisitor.java
index 4db0c3c..e6f8d0c 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsRequiresSemiVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsRequiresSemiVisitor.java
@@ -64,37 +64,37 @@
   }
 
   @Override
-  public boolean visit(JsBlock x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsBlock x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsBreak x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsBreak x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsDebugger x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsDebugger x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsDoWhile x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsDoWhile x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsEmpty x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsEmpty x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsExprStmt x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsExprStmt x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsFor x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsFor x, JsContext ctx) {
     if (x.getBody() instanceof JsEmpty) {
       needsSemicolon = true;
     }
@@ -102,7 +102,7 @@
   }
 
   @Override
-  public boolean visit(JsForIn x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsForIn x, JsContext ctx) {
     if (x.getBody() instanceof JsEmpty) {
       needsSemicolon = true;
     }
@@ -110,7 +110,7 @@
   }
 
   @Override
-  public boolean visit(JsIf x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsIf x, JsContext ctx) {
     JsStatement thenStmt = x.getThenStmt();
     JsStatement elseStmt = x.getElseStmt();
     JsStatement toCheck = thenStmt;
@@ -127,7 +127,7 @@
   }
 
   @Override
-  public boolean visit(JsLabel x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsLabel x, JsContext ctx) {
     if (x.getStmt() instanceof JsEmpty) {
       needsSemicolon = true;
     }
@@ -135,32 +135,32 @@
   }
 
   @Override
-  public boolean visit(JsReturn x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsReturn x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsSwitch x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsSwitch x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsThrow x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsThrow x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsTry x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsTry x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsVars x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsVars x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsWhile x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsWhile x, JsContext ctx) {
     if (x.getBody() instanceof JsEmpty) {
       needsSemicolon = true;
     }
diff --git a/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitor.java
index 5eea334..23f482f 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitor.java
@@ -19,7 +19,6 @@
 import com.google.gwt.dev.js.ast.JsContext;
 import com.google.gwt.dev.js.ast.JsProgram;
 import com.google.gwt.dev.js.ast.JsProgramFragment;
-import com.google.gwt.dev.js.ast.JsStatement;
 import com.google.gwt.dev.util.TextOutput;
 
 /**
@@ -33,10 +32,10 @@
   public JsSourceGenerationVisitor(TextOutput out) {
     super(out);
   }
-  
+
   /**
    * Generate the output source code using short or long identifiers.
-   *
+   * 
    * @param useLongIdents if true, emit all identifiers in long form
    */
   public JsSourceGenerationVisitor(TextOutput out, boolean useLongIdents) {
@@ -44,19 +43,19 @@
   }
 
   @Override
-  public boolean visit(JsProgram x, JsContext<JsProgram> ctx) {
+  public boolean visit(JsProgram x, JsContext ctx) {
     // Descend naturally.
     return true;
   }
 
   @Override
-  public boolean visit(JsProgramFragment x, JsContext<JsProgramFragment> ctx) {
+  public boolean visit(JsProgramFragment x, JsContext ctx) {
     // Descend naturally.
     return true;
   }
 
   @Override
-  public boolean visit(JsBlock x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsBlock x, JsContext ctx) {
     printJsBlock(x, false, true);
     return false;
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitorWithSizeBreakdown.java b/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitorWithSizeBreakdown.java
index 1f4bed4..5e1a3a6 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitorWithSizeBreakdown.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitorWithSizeBreakdown.java
@@ -57,25 +57,25 @@
   }
 
   @Override
-  public boolean visit(JsBlock x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsBlock x, JsContext ctx) {
     printJsBlock(x, false, true);
     return false;
   }
 
   @Override
-  public boolean visit(JsProgram x, JsContext<JsProgram> ctx) {
+  public boolean visit(JsProgram x, JsContext ctx) {
     // Descend naturally.
     return true;
   }
 
   @Override
-  public boolean visit(JsProgramFragment x, JsContext<JsProgramFragment> ctx) {
+  public boolean visit(JsProgramFragment x, JsContext ctx) {
     // Descend naturally.
     return true;
   }
 
   @Override
-  protected <T extends JsVisitable<T>> T doAccept(T node) {
+  protected <T extends JsVisitable> T doAccept(T node) {
     JsName newName = nameToBillTo(node);
     if (newName == null) {
       return super.doAccept(node);
@@ -91,14 +91,14 @@
   }
 
   @Override
-  protected <T extends JsVisitable<T>> void doAcceptList(List<T> collection) {
+  protected <T extends JsVisitable> void doAcceptList(List<T> collection) {
     for (T t : collection) {
       doAccept(t);
     }
   }
 
   @Override
-  protected <T extends JsVisitable<T>> void doAcceptWithInsertRemove(
+  protected <T extends JsVisitable> void doAcceptWithInsertRemove(
       List<T> collection) {
     for (T t : collection) {
       doAccept(t);
@@ -114,10 +114,9 @@
   }
 
   /**
-   * If parameter is JsVisitable<?>, javac version sun jdk1.6.0 complains about
+   * If parameter is JsVisitable, javac version sun jdk1.6.0 complains about
    * incompatible types.
    */
-  @SuppressWarnings("unchecked")
   private JsName nameToBillTo(JsVisitable node) {
     if (node instanceof JsStatement) {
       JsStatement stat = (JsStatement) node;
diff --git a/dev/core/src/com/google/gwt/dev/js/JsStackEmulator.java b/dev/core/src/com/google/gwt/dev/js/JsStackEmulator.java
index e47f597..26bcfbc 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsStackEmulator.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsStackEmulator.java
@@ -89,7 +89,7 @@
     }
 
     @Override
-    public void endVisit(JsExprStmt x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsExprStmt x, JsContext ctx) {
       // Looking for e = caught(e);
       JsExpression expr = x.getExpression();
 
@@ -246,7 +246,7 @@
      * local variables and the final stack-pop instructions.
      */
     @Override
-    public void endVisit(JsBlock x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsBlock x, JsContext ctx) {
       if (x == currentFunction.getBody()) {
 
         // Add the entry code
@@ -273,7 +273,7 @@
     }
 
     @Override
-    public void endVisit(JsReturn x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsReturn x, JsContext ctx) {
       if (outerFinallyBlock != null) {
         // There is a finally block, so we need to set the early-exit flag
         JsBinaryOperation asg = new JsBinaryOperation(x.getSourceInfo(),
@@ -317,20 +317,20 @@
      * <code>visit<code> and not a <code>endVisit</code>.
      */
     @Override
-    public boolean visit(JsCatch x, JsContext<JsCatch> ctx) {
+    public boolean visit(JsCatch x, JsContext ctx) {
       // Reset the stack depth to the local index
       new CatchStackReset(this).accept(x);
       return true;
     }
 
     @Override
-    public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsFunction x, JsContext ctx) {
       // Will be taken care of by the Bootstrap visitor
       return false;
     }
 
     @Override
-    public boolean visit(JsTry x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsTry x, JsContext ctx) {
 
       /*
        * Only the outermost finally block needs special treatment; try/finally
@@ -479,8 +479,7 @@
      * @param x the statement that will cause the pop
      * @param ctx the visitor context
      */
-    private void pop(JsStatement x, JsExpression expr,
-        JsContext<JsStatement> ctx) {
+    private void pop(JsStatement x, JsExpression expr, JsContext ctx) {
       // $stackDepth = stackIndex - 1
       SourceInfo info = x.getSourceInfo().makeChild(JsStackEmulator.class,
           "Stack exit");
@@ -566,7 +565,7 @@
    */
   private class InstrumentAllFunctions extends JsVisitor {
     @Override
-    public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsFunction x, JsContext ctx) {
       if (!x.getBody().getStatements().isEmpty()) {
         if (recordLineNumbers) {
           (new LocationVisitor(x)).accept(x.getBody());
@@ -602,7 +601,7 @@
      * reference. These are tracked because it wouldn't be safe to rewrite
      * <code>delete foo.bar</code> to <code>delete (line='123',foo).bar</code>.
      */
-    private final Set<JsNode<?>> nodesInRefContext = new HashSet<JsNode<?>>();
+    private final Set<JsNode> nodesInRefContext = new HashSet<JsNode>();
 
     public LocationVisitor(JsFunction function) {
       super(function);
@@ -610,40 +609,40 @@
     }
 
     @Override
-    public void endVisit(JsArrayAccess x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsArrayAccess x, JsContext ctx) {
       record(x, ctx);
     }
 
     @Override
-    public void endVisit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsBinaryOperation x, JsContext ctx) {
       if (x.getOperator().isAssignment()) {
         record(x, ctx);
       }
     }
 
     @Override
-    public void endVisit(JsInvocation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsInvocation x, JsContext ctx) {
       nodesInRefContext.remove(x.getQualifier());
       record(x, ctx);
     }
 
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       record(x, ctx);
     }
 
     @Override
-    public void endVisit(JsNew x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNew x, JsContext ctx) {
       record(x, ctx);
     }
 
     @Override
-    public void endVisit(JsPostfixOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsPostfixOperation x, JsContext ctx) {
       record(x, ctx);
     }
 
     @Override
-    public void endVisit(JsPrefixOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsPrefixOperation x, JsContext ctx) {
       record(x, ctx);
       nodesInRefContext.remove(x.getArg());
     }
@@ -655,7 +654,7 @@
      * so that location data will be recorded correctly.
      */
     @Override
-    public boolean visit(JsFor x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsFor x, JsContext ctx) {
       if (x.getInitExpr() != null) {
         x.setInitExpr(accept(x.getInitExpr()));
       } else if (x.getInitVars() != null) {
@@ -677,13 +676,13 @@
     }
 
     @Override
-    public boolean visit(JsInvocation x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsInvocation x, JsContext ctx) {
       nodesInRefContext.add(x.getQualifier());
       return true;
     }
 
     @Override
-    public boolean visit(JsPrefixOperation x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsPrefixOperation x, JsContext ctx) {
       if (x.getOperator() == JsUnaryOperator.DELETE
           || x.getOperator() == JsUnaryOperator.TYPEOF) {
         nodesInRefContext.add(x.getArg());
@@ -696,7 +695,7 @@
      * evaluating the condition.
      */
     @Override
-    public boolean visit(JsWhile x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsWhile x, JsContext ctx) {
       resetPosition();
       x.setCondition(accept(x.getCondition()));
       accept(x.getBody());
@@ -720,7 +719,7 @@
       }
     }
 
-    private void record(JsExpression x, JsContext<JsExpression> ctx) {
+    private void record(JsExpression x, JsContext ctx) {
       if (ctx.isLvalue()) {
         // Assignments to comma expressions aren't legal
         return;
@@ -780,7 +779,7 @@
         "$stackDepth");
 
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       JsName name = x.getName();
       JsNameRef newRef = null;
 
@@ -808,7 +807,7 @@
   public enum StackMode {
     STRIP, NATIVE, EMULATED;
   }
-  
+
   public static void exec(JsProgram program, PropertyOracle[] propertyOracles) {
     if (getStackMode(propertyOracles) == StackMode.EMULATED) {
       (new JsStackEmulator(program, propertyOracles)).execImpl();
@@ -836,10 +835,9 @@
           property = propertyOracles[i].getSelectionProperty(TreeLogger.NULL,
               PROPERTY_NAME);
         } catch (BadPropertyValueException e) {
-          // OK! 
+          // OK!
         }
-        assert value.equals(property.getCurrentValue()) : 
-            "compiler.stackMode property has multiple values.";
+        assert value.equals(property.getCurrentValue()) : "compiler.stackMode property has multiple values.";
       }
     }
     return stackMode;
diff --git a/dev/core/src/com/google/gwt/dev/js/JsStaticEval.java b/dev/core/src/com/google/gwt/dev/js/JsStaticEval.java
index 7ee24e7..aaa9db5 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsStaticEval.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsStaticEval.java
@@ -76,12 +76,12 @@
     private boolean hasBreakContinueStatements = false;
 
     @Override
-    public void endVisit(JsBreak x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsBreak x, JsContext ctx) {
       hasBreakContinueStatements = true;
     }
 
     @Override
-    public void endVisit(JsContinue x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsContinue x, JsContext ctx) {
       hasBreakContinueStatements = true;
     }
 
@@ -109,7 +109,7 @@
     }
 
     @Override
-    public void endVisit(JsExprStmt x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsExprStmt x, JsContext ctx) {
       JsFunction func = isFunctionDecl(x);
       if (func != null) {
         mustExec.add(x);
@@ -117,7 +117,7 @@
     }
 
     @Override
-    public void endVisit(JsVars x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsVars x, JsContext ctx) {
       JsVars strippedVars = new JsVars(x.getSourceInfo().makeChild(
           MustExecVisitor.class, "Simplified execution"));
       boolean mustReplace = false;
@@ -141,7 +141,7 @@
     }
 
     @Override
-    public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsFunction x, JsContext ctx) {
       // Don't dive into nested functions.
       return false;
     }
@@ -164,7 +164,7 @@
     private Map<JsExpression, Boolean> coercesToStringMap = new IdentityHashMap<JsExpression, Boolean>();
 
     @Override
-    public void endVisit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsBinaryOperation x, JsContext ctx) {
       JsBinaryOperator op = x.getOperator();
       JsExpression arg1 = x.getArg1();
       JsExpression arg2 = x.getArg2();
@@ -191,7 +191,7 @@
      * Prune dead statements and empty blocks.
      */
     @Override
-    public void endVisit(JsBlock x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsBlock x, JsContext ctx) {
       /*
        * Remove any dead statements after an abrupt change in code flow and
        * promote safe statements within nested blocks to this block.
@@ -235,7 +235,7 @@
     }
 
     @Override
-    public void endVisit(JsConditional x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsConditional x, JsContext ctx) {
       evalBooleanContext.remove(x.getTestExpression());
 
       JsExpression condExpr = x.getTestExpression();
@@ -262,7 +262,7 @@
      * Convert do { } while (false); into a block.
      */
     @Override
-    public void endVisit(JsDoWhile x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsDoWhile x, JsContext ctx) {
       evalBooleanContext.remove(x.getCondition());
 
       JsExpression expr = x.getCondition();
@@ -286,7 +286,7 @@
     }
 
     @Override
-    public void endVisit(JsExprStmt x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsExprStmt x, JsContext ctx) {
       if (!x.getExpression().hasSideEffects()) {
         if (ctx.canRemove()) {
           ctx.removeMe();
@@ -300,7 +300,7 @@
      * Prune for (X; false(); Y) statements, make sure X and false() are run.
      */
     @Override
-    public void endVisit(JsFor x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsFor x, JsContext ctx) {
       evalBooleanContext.remove(x.getCondition());
 
       JsExpression expr = x.getCondition();
@@ -331,7 +331,7 @@
      * Simplify if statements.
      */
     @Override
-    public void endVisit(JsIf x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsIf x, JsContext ctx) {
       evalBooleanContext.remove(x.getIfExpr());
 
       JsExpression condExpr = x.getIfExpr();
@@ -390,7 +390,7 @@
      * Change !!x to x in a boolean context.
      */
     @Override
-    public void endVisit(JsPrefixOperation x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsPrefixOperation x, JsContext ctx) {
       if (x.getOperator() == JsUnaryOperator.NOT) {
         evalBooleanContext.remove(x.getArg());
       }
@@ -411,7 +411,7 @@
      * Prune while (false) statements.
      */
     @Override
-    public void endVisit(JsWhile x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsWhile x, JsContext ctx) {
       evalBooleanContext.remove(x.getCondition());
 
       JsExpression expr = x.getCondition();
@@ -433,31 +433,31 @@
     }
 
     @Override
-    public boolean visit(JsConditional x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsConditional x, JsContext ctx) {
       evalBooleanContext.add(x.getTestExpression());
       return true;
     }
 
     @Override
-    public boolean visit(JsDoWhile x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsDoWhile x, JsContext ctx) {
       evalBooleanContext.add(x.getCondition());
       return true;
     }
 
     @Override
-    public boolean visit(JsFor x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsFor x, JsContext ctx) {
       evalBooleanContext.add(x.getCondition());
       return true;
     }
 
     @Override
-    public boolean visit(JsIf x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsIf x, JsContext ctx) {
       evalBooleanContext.add(x.getIfExpr());
       return true;
     }
 
     @Override
-    public boolean visit(JsPrefixOperation x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsPrefixOperation x, JsContext ctx) {
       if (x.getOperator() == JsUnaryOperator.NOT) {
         evalBooleanContext.add(x.getArg());
       }
@@ -465,7 +465,7 @@
     }
 
     @Override
-    public boolean visit(JsWhile x, JsContext<JsStatement> ctx) {
+    public boolean visit(JsWhile x, JsContext ctx) {
       evalBooleanContext.add(x.getCondition());
       return true;
     }
@@ -651,7 +651,7 @@
      * Simplify a + b.
      */
     private void trySimplifyAdd(JsExpression original, JsExpression arg1,
-        JsExpression arg2, JsContext<JsExpression> ctx) {
+        JsExpression arg2, JsContext ctx) {
       if (arg1 instanceof JsValueLiteral && arg2 instanceof JsValueLiteral) {
         // case: number + number
         if (arg1 instanceof JsNumberLiteral && arg2 instanceof JsNumberLiteral) {
@@ -676,7 +676,7 @@
      * expressions as left-normal as possible.
      */
     private boolean trySimplifyAssociativeExpression(JsBinaryOperation x,
-        JsContext<JsExpression> ctx) {
+        JsContext ctx) {
       boolean toReturn = false;
       JsBinaryOperator op = x.getOperator();
       JsExpression arg1 = x.getArg1();
@@ -770,7 +770,7 @@
     }
 
     private void trySimplifyEq(JsExpression original, JsExpression arg1,
-        JsExpression arg2, JsContext<JsExpression> ctx) {
+        JsExpression arg2, JsContext ctx) {
       JsExpression updated = simplifyEq(original, arg1, arg2);
       if (updated != original) {
         ctx.replaceMe(updated);
@@ -778,15 +778,14 @@
     }
 
     private void trySimplifyNe(JsExpression original, JsExpression arg1,
-        JsExpression arg2, JsContext<JsExpression> ctx) {
+        JsExpression arg2, JsContext ctx) {
       JsExpression updated = simplifyNe(original, arg1, arg2);
       if (updated != original) {
         ctx.replaceMe(updated);
       }
     }
 
-    private boolean tryStaticEvalIf(JsIf x, CanBooleanEval cond,
-        JsContext<JsStatement> ctx) {
+    private boolean tryStaticEvalIf(JsIf x, CanBooleanEval cond, JsContext ctx) {
       JsStatement thenStmt = x.getThenStmt();
       JsStatement elseStmt = x.getElseStmt();
       if (cond.isBooleanTrue()) {
@@ -831,18 +830,17 @@
       JsBinaryOperator.BIT_OR, JsBinaryOperator.BIT_XOR,
       JsBinaryOperator.COMMA, JsBinaryOperator.MUL, JsBinaryOperator.OR);
 
-  @SuppressWarnings("unchecked")
   public static <T extends JsVisitable> T exec(JsProgram program, T node) {
-    Event optimizeJsEvent = SpeedTracerLogger.start(CompilerEventType.OPTIMIZE_JS, 
-        "optimizer", NAME);
+    Event optimizeJsEvent = SpeedTracerLogger.start(
+        CompilerEventType.OPTIMIZE_JS, "optimizer", NAME);
     T result = new JsStaticEval(program).execImpl(node);
     optimizeJsEvent.end();
     return result;
   }
 
   public static OptimizerStats exec(JsProgram program) {
-    Event optimizeJsEvent = SpeedTracerLogger.start(CompilerEventType.OPTIMIZE_JS, 
-        "optimizer", NAME);
+    Event optimizeJsEvent = SpeedTracerLogger.start(
+        CompilerEventType.OPTIMIZE_JS, "optimizer", NAME);
     OptimizerStats stats = new JsStaticEval(program).execImpl();
     optimizeJsEvent.end("didChange", "" + stats.didChange());
     return stats;
@@ -902,7 +900,7 @@
    * </pre>
    */
   protected static void shortCircuitAnd(JsExpression arg1, JsExpression arg2,
-      JsContext<JsExpression> ctx) {
+      JsContext ctx) {
     if (arg1 instanceof CanBooleanEval) {
       CanBooleanEval eval1 = (CanBooleanEval) arg1;
       if (eval1.isBooleanTrue() && !arg1.hasSideEffects()) {
@@ -922,7 +920,7 @@
    * </pre>
    */
   protected static void shortCircuitOr(JsExpression arg1, JsExpression arg2,
-      JsContext<JsExpression> ctx) {
+      JsContext ctx) {
     if (arg1 instanceof CanBooleanEval) {
       CanBooleanEval eval1 = (CanBooleanEval) arg1;
       if (eval1.isBooleanTrue()) {
@@ -934,7 +932,7 @@
   }
 
   protected static void trySimplifyComma(JsExpression arg1, JsExpression arg2,
-      JsContext<JsExpression> ctx) {
+      JsContext ctx) {
     if (!arg1.hasSideEffects()) {
       ctx.replaceMe(arg2);
     }
@@ -946,7 +944,6 @@
     this.program = program;
   }
 
-  @SuppressWarnings("unchecked")
   public <T extends JsVisitable> T execImpl(T node) {
     return new StaticEvalVisitor().accept(node);
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/JsStringInterner.java b/dev/core/src/com/google/gwt/dev/js/JsStringInterner.java
index 126bd52..f85bf7e 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsStringInterner.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsStringInterner.java
@@ -20,7 +20,6 @@
 import com.google.gwt.dev.js.ast.JsBinaryOperation;
 import com.google.gwt.dev.js.ast.JsBlock;
 import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsModVisitor;
 import com.google.gwt.dev.js.ast.JsName;
 import com.google.gwt.dev.js.ast.JsPostfixOperation;
@@ -38,11 +37,11 @@
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.SortedMap;
 import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
-import java.util.Map.Entry;
 
 /**
  * Interns all String literals in a JsProgram. Each unique String will be
@@ -106,7 +105,7 @@
     }
 
     @Override
-    public void endVisit(JsProgramFragment x, JsContext<JsProgramFragment> ctx) {
+    public void endVisit(JsProgramFragment x, JsContext ctx) {
       currentFragment++;
     }
 
@@ -114,7 +113,7 @@
      * Prevents 'fixing' an otherwise illegal operation.
      */
     @Override
-    public boolean visit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsBinaryOperation x, JsContext ctx) {
       return !x.getOperator().isAssignment()
           || !(x.getArg1() instanceof JsStringLiteral);
     }
@@ -123,7 +122,7 @@
      * Prevents 'fixing' an otherwise illegal operation.
      */
     @Override
-    public boolean visit(JsPostfixOperation x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsPostfixOperation x, JsContext ctx) {
       return !(x.getArg() instanceof JsStringLiteral);
     }
 
@@ -131,7 +130,7 @@
      * Prevents 'fixing' an otherwise illegal operation.
      */
     @Override
-    public boolean visit(JsPrefixOperation x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsPrefixOperation x, JsContext ctx) {
       return !(x.getArg() instanceof JsStringLiteral);
     }
 
@@ -141,8 +140,7 @@
      * and never evaluated as an expression.
      */
     @Override
-    public boolean visit(JsPropertyInitializer x,
-        JsContext<JsPropertyInitializer> ctx) {
+    public boolean visit(JsPropertyInitializer x, JsContext ctx) {
       x.setValueExpr(accept(x.getValueExpr()));
       return false;
     }
@@ -151,7 +149,7 @@
      * Replace JsStringLiteral instances with JsNameRefs.
      */
     @Override
-    public boolean visit(JsStringLiteral x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsStringLiteral x, JsContext ctx) {
       JsName name = toCreate.get(x);
       if (name == null) {
         String ident = PREFIX + lastId++;
@@ -188,7 +186,7 @@
      * declarations that look like they were created by the interner.
      */
     @Override
-    public boolean visit(JsVar x, JsContext<JsVar> ctx) {
+    public boolean visit(JsVar x, JsContext ctx) {
       return !(x.getName().getIdent().startsWith(PREFIX));
     }
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java
index a8d1e1e..93588fa 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsToStringGenerationVisitor.java
@@ -61,22 +61,21 @@
 import com.google.gwt.dev.js.ast.JsStatement;
 import com.google.gwt.dev.js.ast.JsStringLiteral;
 import com.google.gwt.dev.js.ast.JsSwitch;
-import com.google.gwt.dev.js.ast.JsSwitchMember;
 import com.google.gwt.dev.js.ast.JsThisRef;
 import com.google.gwt.dev.js.ast.JsThrow;
 import com.google.gwt.dev.js.ast.JsTry;
 import com.google.gwt.dev.js.ast.JsUnaryOperator;
 import com.google.gwt.dev.js.ast.JsVars;
+import com.google.gwt.dev.js.ast.JsVars.JsVar;
 import com.google.gwt.dev.js.ast.JsVisitor;
 import com.google.gwt.dev.js.ast.JsWhile;
-import com.google.gwt.dev.js.ast.JsVars.JsVar;
 import com.google.gwt.dev.util.TextOutput;
 import com.google.gwt.dev.util.collect.HashSet;
 
 import java.util.ArrayList;
 import java.util.Iterator;
-import java.util.Set;
 import java.util.List;
+import java.util.Set;
 import java.util.regex.Pattern;
 
 /**
@@ -275,10 +274,10 @@
   public JsToStringGenerationVisitor(TextOutput out) {
     this(out, false);
   }
-  
+
   /**
    * Generate the output string using short or long identifiers.
-   *
+   * 
    * @param useLongIdents if true, emit all identifiers in long form
    */
   JsToStringGenerationVisitor(TextOutput out, boolean useLongIdents) {
@@ -291,7 +290,7 @@
   }
 
   @Override
-  public boolean visit(JsArrayAccess x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsArrayAccess x, JsContext ctx) {
     JsExpression arrayExpr = x.getArrayExpr();
     _parenPush(x, arrayExpr, false);
     accept(arrayExpr);
@@ -303,7 +302,7 @@
   }
 
   @Override
-  public boolean visit(JsArrayLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsArrayLiteral x, JsContext ctx) {
     _lsquare();
     boolean sep = false;
     for (Object element : x.getExpressions()) {
@@ -318,7 +317,7 @@
   }
 
   @Override
-  public boolean visit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsBinaryOperation x, JsContext ctx) {
     JsBinaryOperator op = x.getOperator();
     JsExpression arg1 = x.getArg1();
     _parenPush(x, arg1, !op.isLeftAssociative());
@@ -343,13 +342,13 @@
   }
 
   @Override
-  public boolean visit(JsBlock x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsBlock x, JsContext ctx) {
     printJsBlock(x, true, true);
     return false;
   }
 
   @Override
-  public boolean visit(JsBooleanLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsBooleanLiteral x, JsContext ctx) {
     if (x.getValue()) {
       _true();
     } else {
@@ -359,7 +358,7 @@
   }
 
   @Override
-  public boolean visit(JsBreak x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsBreak x, JsContext ctx) {
     _break();
 
     JsNameRef label = x.getLabel();
@@ -372,7 +371,7 @@
   }
 
   @Override
-  public boolean visit(JsCase x, JsContext<JsSwitchMember> ctx) {
+  public boolean visit(JsCase x, JsContext ctx) {
     _case();
     _space();
     accept(x.getCaseExpr());
@@ -395,7 +394,7 @@
   }
 
   @Override
-  public boolean visit(JsCatch x, JsContext<JsCatch> ctx) {
+  public boolean visit(JsCatch x, JsContext ctx) {
     _spaceOpt();
     _catch();
     _spaceOpt();
@@ -420,7 +419,7 @@
   }
 
   @Override
-  public boolean visit(JsConditional x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsConditional x, JsContext ctx) {
     // Associativity: for the then and else branches, it is safe to insert
     // another
     // ternary expression, but if the test expression is a ternary, it should
@@ -449,7 +448,7 @@
   }
 
   @Override
-  public boolean visit(JsContinue x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsContinue x, JsContext ctx) {
     _continue();
 
     JsNameRef label = x.getLabel();
@@ -462,13 +461,13 @@
   }
 
   @Override
-  public boolean visit(JsDebugger x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsDebugger x, JsContext ctx) {
     _debugger();
     return false;
   }
 
   @Override
-  public boolean visit(JsDefault x, JsContext<JsSwitchMember> ctx) {
+  public boolean visit(JsDefault x, JsContext ctx) {
     _default();
     _colon();
 
@@ -488,7 +487,7 @@
   }
 
   @Override
-  public boolean visit(JsDoWhile x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsDoWhile x, JsContext ctx) {
     _do();
     _nestedPush(x.getBody(), true);
     accept(x.getBody());
@@ -509,12 +508,12 @@
   }
 
   @Override
-  public boolean visit(JsEmpty x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsEmpty x, JsContext ctx) {
     return false;
   }
 
   @Override
-  public boolean visit(JsExprStmt x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsExprStmt x, JsContext ctx) {
     boolean surroundWithParentheses = JsFirstExpressionVisitor.exec(x);
     if (surroundWithParentheses) {
       _lparen();
@@ -528,7 +527,7 @@
   }
 
   @Override
-  public boolean visit(JsFor x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsFor x, JsContext ctx) {
     _for();
     _spaceOpt();
     _lparen();
@@ -567,7 +566,7 @@
   }
 
   @Override
-  public boolean visit(JsForIn x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsForIn x, JsContext ctx) {
     _for();
     _spaceOpt();
     _lparen();
@@ -606,7 +605,7 @@
   // }
   //
   @Override
-  public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsFunction x, JsContext ctx) {
     _function();
 
     // Functions can be anonymous.
@@ -631,7 +630,7 @@
   }
 
   @Override
-  public boolean visit(JsIf x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsIf x, JsContext ctx) {
     _if();
     _spaceOpt();
     _lparen();
@@ -666,7 +665,7 @@
   }
 
   @Override
-  public boolean visit(JsInvocation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsInvocation x, JsContext ctx) {
     JsExpression qualifier = x.getQualifier();
     _parenPush(x, qualifier, false);
     accept(qualifier);
@@ -686,7 +685,7 @@
   }
 
   @Override
-  public boolean visit(JsLabel x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsLabel x, JsContext ctx) {
     _nameOf(x);
     _colon();
     _spaceOpt();
@@ -695,18 +694,18 @@
   }
 
   @Override
-  public boolean visit(JsNameOf x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNameOf x, JsContext ctx) {
     if (useLongIdents) {
       printStringLiteral(x.getName().getIdent());
     } else {
       printStringLiteral(x.getName().getShortIdent());
     }
-    
+
     return false;
   }
 
   @Override
-  public boolean visit(JsNameRef x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNameRef x, JsContext ctx) {
     JsExpression q = x.getQualifier();
     if (q != null) {
       _parenPush(x, q, false);
@@ -725,7 +724,7 @@
   }
 
   @Override
-  public boolean visit(JsNew x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNew x, JsContext ctx) {
     _new();
     _space();
 
@@ -760,13 +759,13 @@
   }
 
   @Override
-  public boolean visit(JsNullLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNullLiteral x, JsContext ctx) {
     _null();
     return false;
   }
 
   @Override
-  public boolean visit(JsNumberLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNumberLiteral x, JsContext ctx) {
     double dvalue = x.getValue();
     long lvalue = (long) dvalue;
     if (lvalue == dvalue) {
@@ -778,7 +777,7 @@
   }
 
   @Override
-  public boolean visit(JsObjectLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsObjectLiteral x, JsContext ctx) {
     _lbrace();
     boolean sep = false;
     for (Object element : x.getPropertyInitializers()) {
@@ -808,13 +807,13 @@
   }
 
   @Override
-  public boolean visit(JsParameter x, JsContext<JsParameter> ctx) {
+  public boolean visit(JsParameter x, JsContext ctx) {
     _nameOf(x);
     return false;
   }
 
   @Override
-  public boolean visit(JsPostfixOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsPostfixOperation x, JsContext ctx) {
     JsUnaryOperator op = x.getOperator();
     JsExpression arg = x.getArg();
     // unary operators always associate correctly (I think)
@@ -826,7 +825,7 @@
   }
 
   @Override
-  public boolean visit(JsPrefixOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsPrefixOperation x, JsContext ctx) {
     JsUnaryOperator op = x.getOperator();
     p.print(op.getSymbol());
     JsExpression arg = x.getArg();
@@ -841,20 +840,19 @@
   }
 
   @Override
-  public boolean visit(JsProgram x, JsContext<JsProgram> ctx) {
+  public boolean visit(JsProgram x, JsContext ctx) {
     p.print("<JsProgram>");
     return false;
   }
 
   @Override
-  public boolean visit(JsProgramFragment x, JsContext<JsProgramFragment> ctx) {
+  public boolean visit(JsProgramFragment x, JsContext ctx) {
     p.print("<JsProgramFragment>");
     return false;
   }
 
   @Override
-  public boolean visit(JsPropertyInitializer x,
-      JsContext<JsPropertyInitializer> ctx) {
+  public boolean visit(JsPropertyInitializer x, JsContext ctx) {
     // Since there are separators, we actually print the property init
     // in visit(JsObjectLiteral).
     //
@@ -862,7 +860,7 @@
   }
 
   @Override
-  public boolean visit(JsRegExp x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsRegExp x, JsContext ctx) {
     _slash();
     p.print(x.getPattern());
     _slash();
@@ -874,7 +872,7 @@
   }
 
   @Override
-  public boolean visit(JsReturn x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsReturn x, JsContext ctx) {
     _return();
     JsExpression expr = x.getExpr();
     if (expr != null) {
@@ -885,13 +883,13 @@
   }
 
   @Override
-  public boolean visit(JsStringLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsStringLiteral x, JsContext ctx) {
     printStringLiteral(x.getValue());
     return false;
   }
 
   @Override
-  public boolean visit(JsSwitch x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsSwitch x, JsContext ctx) {
     _switch();
     _spaceOpt();
     _lparen();
@@ -905,13 +903,13 @@
   }
 
   @Override
-  public boolean visit(JsThisRef x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsThisRef x, JsContext ctx) {
     _this();
     return false;
   }
 
   @Override
-  public boolean visit(JsThrow x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsThrow x, JsContext ctx) {
     _throw();
     _space();
     accept(x.getExpr());
@@ -919,7 +917,7 @@
   }
 
   @Override
-  public boolean visit(JsTry x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsTry x, JsContext ctx) {
     _try();
     _spaceOpt();
     accept(x.getTryBlock());
@@ -938,7 +936,7 @@
   }
 
   @Override
-  public boolean visit(JsVar x, JsContext<JsVar> ctx) {
+  public boolean visit(JsVar x, JsContext ctx) {
     _nameOf(x);
     JsExpression initExpr = x.getInitExpr();
     if (initExpr != null) {
@@ -953,7 +951,7 @@
   }
 
   @Override
-  public boolean visit(JsVars x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsVars x, JsContext ctx) {
     _var();
     _space();
     boolean sep = false;
@@ -965,7 +963,7 @@
   }
 
   @Override
-  public boolean visit(JsWhile x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsWhile x, JsContext ctx) {
     _while();
     _spaceOpt();
     _lparen();
diff --git a/dev/core/src/com/google/gwt/dev/js/JsUnusedFunctionRemover.java b/dev/core/src/com/google/gwt/dev/js/JsUnusedFunctionRemover.java
index c99a3b4..b51a5e3 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsUnusedFunctionRemover.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsUnusedFunctionRemover.java
@@ -19,13 +19,11 @@
 import com.google.gwt.dev.jjs.impl.OptimizerStats;
 import com.google.gwt.dev.js.ast.JsContext;
 import com.google.gwt.dev.js.ast.JsExprStmt;
-import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsFunction;
 import com.google.gwt.dev.js.ast.JsModVisitor;
 import com.google.gwt.dev.js.ast.JsName;
 import com.google.gwt.dev.js.ast.JsNameRef;
 import com.google.gwt.dev.js.ast.JsProgram;
-import com.google.gwt.dev.js.ast.JsStatement;
 import com.google.gwt.dev.js.ast.JsVisitor;
 import com.google.gwt.dev.util.log.speedtracer.CompilerEventType;
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
@@ -46,7 +44,7 @@
   private class JsFunctionVisitor extends JsVisitor {
 
     @Override
-    public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsFunction x, JsContext ctx) {
       // Anonymous function, ignore it
       if (x.getName() != null && !x.isArtificiallyRescued()) {
         toRemove.put(x.getName(), x);
@@ -60,7 +58,7 @@
   private class JsNameRefVisitor extends JsVisitor {
 
     @Override
-    public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsNameRef x, JsContext ctx) {
       toRemove.remove(x.getName());
     }
   }
@@ -68,7 +66,7 @@
   private class RemovalVisitor extends JsModVisitor {
 
     @Override
-    public void endVisit(JsExprStmt x, JsContext<JsStatement> ctx) {
+    public void endVisit(JsExprStmt x, JsContext ctx) {
       if (!(x.getExpression() instanceof JsFunction)) {
         return;
       }
@@ -96,8 +94,8 @@
   }
 
   public static OptimizerStats exec(JsProgram program) {
-    Event optimizeJsEvent = SpeedTracerLogger.start(CompilerEventType.OPTIMIZE_JS,
-        "optimizer", NAME);
+    Event optimizeJsEvent = SpeedTracerLogger.start(
+        CompilerEventType.OPTIMIZE_JS, "optimizer", NAME);
     OptimizerStats stats = new JsUnusedFunctionRemover(program).execImpl();
     optimizeJsEvent.end("didChange", "" + stats.didChange());
     return stats;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/HasArguments.java b/dev/core/src/com/google/gwt/dev/js/ast/HasArguments.java
index 65561b1..8e4122f 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/HasArguments.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/HasArguments.java
@@ -23,5 +23,5 @@
 public interface HasArguments {
 
   List<JsExpression> getArguments();
-  
+
 }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/HasCondition.java b/dev/core/src/com/google/gwt/dev/js/ast/HasCondition.java
index 2b70bd5..fd21feb 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/HasCondition.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/HasCondition.java
@@ -20,5 +20,6 @@
  */
 public interface HasCondition {
   JsExpression getCondition();
+
   void setCondition(JsExpression condition);
 }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsArrayAccess.java b/dev/core/src/com/google/gwt/dev/js/ast/JsArrayAccess.java
index 77f6604..5ab9e27 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsArrayAccess.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsArrayAccess.java
@@ -68,7 +68,7 @@
     this.indexExpr = indexExpr;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       arrayExpr = v.accept(arrayExpr);
       indexExpr = v.accept(indexExpr);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsArrayLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsArrayLiteral.java
index 6e32762..8c83b23 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsArrayLiteral.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsArrayLiteral.java
@@ -63,7 +63,7 @@
     return false;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       v.acceptWithInsertRemove(exprs);
     }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsBinaryOperation.java b/dev/core/src/com/google/gwt/dev/js/ast/JsBinaryOperation.java
index 12a8767..6018e3a 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsBinaryOperation.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsBinaryOperation.java
@@ -104,7 +104,7 @@
     this.arg2 = arg2;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       if (op.isAssignment()) {
         arg1 = v.acceptLvalue(arg1);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsBlock.java b/dev/core/src/com/google/gwt/dev/js/ast/JsBlock.java
index 0cbf91c..e7de0ed 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsBlock.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsBlock.java
@@ -39,7 +39,7 @@
     return false;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       v.acceptWithInsertRemove(stmts);
     }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsBooleanLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsBooleanLiteral.java
index 51a613d..e254270 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsBooleanLiteral.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsBooleanLiteral.java
@@ -52,7 +52,7 @@
     return false;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     v.visit(this, ctx);
     v.endVisit(this, ctx);
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsBreak.java b/dev/core/src/com/google/gwt/dev/js/ast/JsBreak.java
index 5c63bde..17e7d1b 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsBreak.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsBreak.java
@@ -37,7 +37,7 @@
     return label;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       if (label != null) {
         v.accept(label);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsCase.java b/dev/core/src/com/google/gwt/dev/js/ast/JsCase.java
index a1c7006..b7e267e 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsCase.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsCase.java
@@ -36,7 +36,7 @@
     this.caseExpr = caseExpr;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsSwitchMember> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       caseExpr = v.accept(caseExpr);
       v.acceptWithInsertRemove(stmts);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsCatch.java b/dev/core/src/com/google/gwt/dev/js/ast/JsCatch.java
index e1d1cd8..5a932cd 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsCatch.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsCatch.java
@@ -20,7 +20,7 @@
 /**
  * Represents a JavaScript catch clause.
  */
-public class JsCatch extends JsNode<JsCatch> implements HasCondition {
+public class JsCatch extends JsNode implements HasCondition {
 
   protected final JsCatchScope scope;
 
@@ -61,7 +61,7 @@
     this.condition = condition;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsCatch> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       param = v.accept(param);
       if (condition != null) {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsConditional.java b/dev/core/src/com/google/gwt/dev/js/ast/JsConditional.java
index 74c2967..2d2c213 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsConditional.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsConditional.java
@@ -80,7 +80,7 @@
     this.thenExpr = thenExpr;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       testExpr = v.accept(testExpr);
       thenExpr = v.accept(thenExpr);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsContext.java b/dev/core/src/com/google/gwt/dev/js/ast/JsContext.java
index 4d63cd1..503538d 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsContext.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsContext.java
@@ -19,22 +19,20 @@
  * The context in which a JsNode visitation occurs. This represents the set of
  * possible operations a JsVisitor subclass can perform on the currently visited
  * node.
- * 
- * @param <T>
  */
-public interface JsContext<T extends JsVisitable<T>> {
+public interface JsContext {
 
   boolean canInsert();
 
   boolean canRemove();
 
-  void insertAfter(T node);
+  void insertAfter(JsVisitable node);
 
-  void insertBefore(T node);
+  void insertBefore(JsVisitable node);
 
   boolean isLvalue();
 
   void removeMe();
 
-  void replaceMe(T node);
+  void replaceMe(JsVisitable node);
 }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsContinue.java b/dev/core/src/com/google/gwt/dev/js/ast/JsContinue.java
index a88b60d..2e7490f 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsContinue.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsContinue.java
@@ -37,7 +37,7 @@
     return label;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       if (label != null) {
         v.accept(label);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsDebugger.java b/dev/core/src/com/google/gwt/dev/js/ast/JsDebugger.java
index 5f0186c..1cef5a7 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsDebugger.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsDebugger.java
@@ -26,7 +26,7 @@
     super(sourceInfo);
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     v.visit(this, ctx);
     v.endVisit(this, ctx);
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsDefault.java b/dev/core/src/com/google/gwt/dev/js/ast/JsDefault.java
index 9ff557f..f81ddf4 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsDefault.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsDefault.java
@@ -26,7 +26,7 @@
     super(sourceInfo);
   }
 
-  public void traverse(JsVisitor v, JsContext<JsSwitchMember> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       v.acceptWithInsertRemove(stmts);
     }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsDoWhile.java b/dev/core/src/com/google/gwt/dev/js/ast/JsDoWhile.java
index 4ce7128..3c75fdb 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsDoWhile.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsDoWhile.java
@@ -53,7 +53,7 @@
     this.condition = condition;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       body = v.accept(body);
       condition = v.accept(condition);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsEmpty.java b/dev/core/src/com/google/gwt/dev/js/ast/JsEmpty.java
index 097e31e..00a5b6f 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsEmpty.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsEmpty.java
@@ -27,7 +27,7 @@
     super(sourceInfo);
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     v.visit(this, ctx);
     v.endVisit(this, ctx);
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsExprStmt.java b/dev/core/src/com/google/gwt/dev/js/ast/JsExprStmt.java
index b4ddcf0..9bdd74d 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsExprStmt.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsExprStmt.java
@@ -33,7 +33,7 @@
     return expr;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       expr = v.accept(expr);
     }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsExpression.java b/dev/core/src/com/google/gwt/dev/js/ast/JsExpression.java
index 13cf5c4..83d5cda 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsExpression.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsExpression.java
@@ -20,8 +20,8 @@
 /**
  * An abstract base class for all JavaScript expressions.
  */
-public abstract class JsExpression extends JsNode<JsExpression> {
-  
+public abstract class JsExpression extends JsNode {
+
   protected JsExpression(SourceInfo sourceInfo) {
     super(sourceInfo);
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsFor.java b/dev/core/src/com/google/gwt/dev/js/ast/JsFor.java
index c2f002b..2703d0f 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsFor.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsFor.java
@@ -84,7 +84,7 @@
     this.initVars = initVars;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       assert (!(initExpr != null && initVars != null));
 
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsForIn.java b/dev/core/src/com/google/gwt/dev/js/ast/JsForIn.java
index a5f750b..c73a56e 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsForIn.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsForIn.java
@@ -68,7 +68,7 @@
     this.objExpr = objExpr;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       if (iterExpr != null) {
         iterExpr = v.acceptLvalue(iterExpr);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsFunction.java b/dev/core/src/com/google/gwt/dev/js/ast/JsFunction.java
index 3aa90e0..959470c 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsFunction.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsFunction.java
@@ -165,7 +165,7 @@
     this.trace = true;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     String before = null;
     if (trace && v instanceof JsModVisitor) {
       before = this.toSource();
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsIf.java b/dev/core/src/com/google/gwt/dev/js/ast/JsIf.java
index b1b9d3d..7f4bdfd 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsIf.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsIf.java
@@ -64,7 +64,7 @@
     this.thenStmt = thenStmt;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       ifExpr = v.accept(ifExpr);
       thenStmt = v.accept(thenStmt);
@@ -78,9 +78,9 @@
   @Override
   public boolean unconditionalControlBreak() {
     boolean thenBreaks = thenStmt != null
-      && thenStmt.unconditionalControlBreak();
+        && thenStmt.unconditionalControlBreak();
     boolean elseBreaks = elseStmt != null
-      && elseStmt.unconditionalControlBreak();
+        && elseStmt.unconditionalControlBreak();
     if (thenBreaks && elseBreaks) {
       // both branches have an unconditional break
       return true;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsInvocation.java b/dev/core/src/com/google/gwt/dev/js/ast/JsInvocation.java
index ac7fdac..2a7bd56 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsInvocation.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsInvocation.java
@@ -60,7 +60,7 @@
     this.qualifier = qualifier;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       qualifier = v.accept(qualifier);
       v.acceptList(args);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsLabel.java b/dev/core/src/com/google/gwt/dev/js/ast/JsLabel.java
index c733b6e..85a8fb7 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsLabel.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsLabel.java
@@ -42,7 +42,8 @@
   public void setStmt(JsStatement stmt) {
     this.stmt = stmt;
   }
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       stmt = v.accept(stmt);
     }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsModVisitor.java b/dev/core/src/com/google/gwt/dev/js/ast/JsModVisitor.java
index bcb2dbc..4577c96 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsModVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsModVisitor.java
@@ -24,7 +24,8 @@
  */
 public class JsModVisitor extends JsVisitor {
 
-  private class ListContext<T extends JsVisitable<T>> implements JsContext<T> {
+  @SuppressWarnings("unchecked")
+  private class ListContext<T extends JsVisitable> implements JsContext {
     private List<T> collection;
     private int index;
     private boolean removed;
@@ -38,15 +39,15 @@
       return true;
     }
 
-    public void insertAfter(T node) {
+    public void insertAfter(JsVisitable node) {
       checkRemoved();
-      collection.add(index + 1, node);
+      collection.add(index + 1, (T) node);
       didChange = true;
     }
 
-    public void insertBefore(T node) {
+    public void insertBefore(JsVisitable node) {
       checkRemoved();
-      collection.add(index++, node);
+      collection.add(index++, (T) node);
       didChange = true;
     }
 
@@ -60,10 +61,10 @@
       didChange = removed = true;
     }
 
-    public void replaceMe(T node) {
+    public void replaceMe(JsVisitable node) {
       checkState();
       checkReplacement(collection.get(index), node);
-      collection.set(index, node);
+      collection.set(index, (T) node);
       didChange = replaced = true;
     }
 
@@ -96,7 +97,8 @@
     }
   }
 
-  private class NodeContext<T extends JsVisitable<T>> implements JsContext<T> {
+  @SuppressWarnings("unchecked")
+  private class NodeContext<T extends JsVisitable> implements JsContext {
     private T node;
     private boolean replaced;
 
@@ -108,11 +110,11 @@
       return false;
     }
 
-    public void insertAfter(T node) {
+    public void insertAfter(JsVisitable node) {
       throw new UnsupportedOperationException();
     }
 
-    public void insertBefore(T node) {
+    public void insertBefore(JsVisitable node) {
       throw new UnsupportedOperationException();
     }
 
@@ -124,12 +126,12 @@
       throw new UnsupportedOperationException();
     }
 
-    public void replaceMe(T node) {
+    public void replaceMe(JsVisitable node) {
       if (replaced) {
         throw new InternalCompilerException("Node was already replaced");
       }
       checkReplacement(this.node, node);
-      this.node = node;
+      this.node = (T) node;
       didChange = replaced = true;
     }
 
@@ -141,8 +143,8 @@
     }
   }
 
-  protected static <T extends JsVisitable<T>> void checkReplacement(T origNode,
-      T newNode) {
+  protected static void checkReplacement(JsVisitable origNode,
+      JsVisitable newNode) {
     if (newNode == null) {
       throw new InternalCompilerException("Cannot replace with null");
     }
@@ -160,12 +162,12 @@
   }
 
   @Override
-  protected <T extends JsVisitable<T>> T doAccept(T node) {
+  protected <T extends JsVisitable> T doAccept(T node) {
     return new NodeContext<T>().traverse(node);
   }
 
   @Override
-  protected <T extends JsVisitable<T>> void doAcceptList(List<T> collection) {
+  protected <T extends JsVisitable> void doAcceptList(List<T> collection) {
     NodeContext<T> ctx = new NodeContext<T>();
     for (int i = 0, c = collection.size(); i < c; ++i) {
       ctx.traverse(collection.get(i));
@@ -181,7 +183,7 @@
   }
 
   @Override
-  protected <T extends JsVisitable<T>> void doAcceptWithInsertRemove(
+  protected <T extends JsVisitable> void doAcceptWithInsertRemove(
       List<T> collection) {
     new ListContext<T>().traverse(collection);
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsName.java b/dev/core/src/com/google/gwt/dev/js/ast/JsName.java
index 0cb1461..2c224d4 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsName.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsName.java
@@ -32,7 +32,6 @@
   /**
    * A back-reference to the JsNode that the JsName refers to.
    */
-  @SuppressWarnings("unchecked")
   private JsNode staticRef;
 
   /**
@@ -57,7 +56,6 @@
     return shortIdent;
   }
 
-  @SuppressWarnings("unchecked")
   public JsNode getStaticRef() {
     return staticRef;
   }
@@ -81,7 +79,6 @@
   /**
    * Should never be called except on immutable stuff.
    */
-  @SuppressWarnings("unchecked")
   public void setStaticRef(JsNode node) {
     this.staticRef = node;
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNameOf.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNameOf.java
index 7fc79a0..27d7e67 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsNameOf.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNameOf.java
@@ -52,7 +52,7 @@
     return false;
   }
 
-  public void traverse(JsVisitor visitor, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor visitor, JsContext ctx) {
     if (visitor.visit(this, ctx)) {
     }
     visitor.endVisit(this, ctx);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNameRef.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNameRef.java
index e967138..58a7a8c 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsNameRef.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNameRef.java
@@ -117,7 +117,7 @@
     this.qualifier = qualifier;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       if (qualifier != null) {
         qualifier = v.accept(qualifier);
@@ -135,7 +135,7 @@
   private SourceInfo maybeUpdateSourceInfo() {
     SourceInfo toReturn = super.getSourceInfo();
     if (!hasStaticRef && name != null) {
-      JsNode<?> staticRef = name.getStaticRef();
+      JsNode staticRef = name.getStaticRef();
       if (staticRef != null) {
         toReturn.copyMissingCorrelationsFrom(name.getStaticRef().getSourceInfo());
         hasStaticRef = true;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNew.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNew.java
index 159a6a4..6bed072 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsNew.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNew.java
@@ -59,7 +59,7 @@
     return false;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       ctorExpr = v.accept(ctorExpr);
       v.acceptList(args);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNode.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNode.java
index 1f4add6..4baa0d4 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsNode.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNode.java
@@ -25,14 +25,12 @@
 
 /**
  * Base class for all JS AST elements.
- * 
- * @param <T>
  */
-public abstract class JsNode<T extends JsVisitable<T>> implements
-    JsVisitable<T>, HasSourceInfo, Serializable {
-  
+public abstract class JsNode implements JsVisitable, HasSourceInfo,
+    Serializable {
+
   private final SourceInfo sourceInfo;
-  
+
   protected JsNode(SourceInfo sourceInfo) {
     assert sourceInfo != null : "SourceInfo must be provided for JsNodes";
     this.sourceInfo = sourceInfo;
@@ -45,11 +43,10 @@
   /**
    * Returns a source code representation of the node using short identifiers.
    */
-  // Causes source generation to delegate to the one visitor
   public final String toSource() {
     return toSource(false);
   }
-  
+
   /**
    * Returns a source code representation of the node using short or long
    * identifiers.
@@ -58,12 +55,15 @@
    */
   public final String toSource(boolean useLongIdents) {
     DefaultTextOutput out = new DefaultTextOutput(false);
-    JsSourceGenerationVisitor v = new JsSourceGenerationVisitor(out, useLongIdents);
+    JsSourceGenerationVisitor v = new JsSourceGenerationVisitor(out,
+        useLongIdents);
     v.accept(this);
     return out.toString();
   }
 
-  // Causes source generation to delegate to the one visitor
+  /**
+   * Causes source generation to delegate to the one visitor.
+   */
   @Override
   public final String toString() {
     DefaultTextOutput out = new DefaultTextOutput(false);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNullLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNullLiteral.java
index bc2a9e0..dba3966 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsNullLiteral.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNullLiteral.java
@@ -45,7 +45,7 @@
     return true;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     v.visit(this, ctx);
     v.endVisit(this, ctx);
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNumberLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNumberLiteral.java
index f91969d..90026ac 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsNumberLiteral.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNumberLiteral.java
@@ -52,7 +52,7 @@
     return false;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     v.visit(this, ctx);
     v.endVisit(this, ctx);
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsObjectLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsObjectLiteral.java
index 2e94511..3b3fcfc 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsObjectLiteral.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsObjectLiteral.java
@@ -63,7 +63,7 @@
     return false;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       v.acceptWithInsertRemove(props);
     }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsParameter.java b/dev/core/src/com/google/gwt/dev/js/ast/JsParameter.java
index b934353..603b3e4 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsParameter.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsParameter.java
@@ -20,7 +20,7 @@
 /**
  * A JavaScript parameter.
  */
-public final class JsParameter extends JsNode<JsParameter> implements HasName {
+public final class JsParameter extends JsNode implements HasName {
 
   private final JsName name;
 
@@ -34,7 +34,7 @@
     return name;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsParameter> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     v.visit(this, ctx);
     v.endVisit(this, ctx);
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsPostfixOperation.java b/dev/core/src/com/google/gwt/dev/js/ast/JsPostfixOperation.java
index b4ec4bf..648bf15 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsPostfixOperation.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsPostfixOperation.java
@@ -42,7 +42,7 @@
   }
 
   @Override
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       super.traverse(v, ctx);
     }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsPrefixOperation.java b/dev/core/src/com/google/gwt/dev/js/ast/JsPrefixOperation.java
index ff41d04..bc813db 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsPrefixOperation.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsPrefixOperation.java
@@ -70,7 +70,7 @@
   }
 
   @Override
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       super.traverse(v, ctx);
     }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsProgram.java b/dev/core/src/com/google/gwt/dev/js/ast/JsProgram.java
index eaca54f..9ab9e27 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsProgram.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsProgram.java
@@ -27,7 +27,7 @@
 /**
  * A JavaScript program.
  */
-public final class JsProgram extends JsNode<JsProgram> {
+public final class JsProgram extends JsNode {
 
   private final CorrelationFactory correlator;
 
@@ -252,7 +252,7 @@
     this.indexedFunctions.putAll(indexedFunctions);
   }
 
-  public void traverse(JsVisitor v, JsContext<JsProgram> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       for (JsProgramFragment fragment : fragments) {
         v.accept(fragment);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsProgramFragment.java b/dev/core/src/com/google/gwt/dev/js/ast/JsProgramFragment.java
index 2b685aa..92aff71 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsProgramFragment.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsProgramFragment.java
@@ -20,7 +20,7 @@
 /**
  * One independently loadable fragment of a {@link JsProgram}.
  */
-public class JsProgramFragment extends JsNode<JsProgramFragment> {
+public class JsProgramFragment extends JsNode {
   private final JsGlobalBlock globalBlock;
 
   public JsProgramFragment(SourceInfo sourceInfo) {
@@ -33,7 +33,7 @@
     return globalBlock;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsProgramFragment> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       v.accept(globalBlock);
     }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsPropertyInitializer.java b/dev/core/src/com/google/gwt/dev/js/ast/JsPropertyInitializer.java
index de18cca..23033a6 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsPropertyInitializer.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsPropertyInitializer.java
@@ -20,7 +20,7 @@
 /**
  * Used in object literals to specify property values by name.
  */
-public class JsPropertyInitializer extends JsNode<JsPropertyInitializer> {
+public class JsPropertyInitializer extends JsNode {
 
   private JsExpression labelExpr;
 
@@ -30,7 +30,8 @@
     super(sourceInfo);
   }
 
-  public JsPropertyInitializer(SourceInfo sourceInfo, JsExpression labelExpr, JsExpression valueExpr) {
+  public JsPropertyInitializer(SourceInfo sourceInfo, JsExpression labelExpr,
+      JsExpression valueExpr) {
     super(sourceInfo);
     this.labelExpr = labelExpr;
     this.valueExpr = valueExpr;
@@ -56,7 +57,7 @@
     this.valueExpr = valueExpr;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsPropertyInitializer> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       labelExpr = v.accept(labelExpr);
       valueExpr = v.accept(valueExpr);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsRegExp.java b/dev/core/src/com/google/gwt/dev/js/ast/JsRegExp.java
index 1c5c376..49579a3 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsRegExp.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsRegExp.java
@@ -64,7 +64,7 @@
     this.pattern = re;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     v.visit(this, ctx);
     v.endVisit(this, ctx);
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsReturn.java b/dev/core/src/com/google/gwt/dev/js/ast/JsReturn.java
index 615178c..9571619 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsReturn.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsReturn.java
@@ -41,7 +41,7 @@
     this.expr = expr;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       if (expr != null) {
         expr = v.accept(expr);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java b/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java
index 2687ede..325f62e 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsRootScope.java
@@ -44,26 +44,41 @@
   private void ctorAddKnownGlobalSymbols() {
     // Section references are from Ecma-262
     // (http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf)
-    String[] commonBuiltins = new String[] {
+    String[] commonBuiltins = new String[]{
         // 15.1.1 Value Properties of the Global Object
         "NaN",
         "Infinity",
         "undefined",
 
         // 15.1.2 Function Properties of the Global Object
-        "eval", "parseInt", "parseFloat",
+        "eval",
+        "parseInt",
+        "parseFloat",
         "isNan",
         "isFinite",
 
         // 15.1.3 URI Handling Function Properties
-        "decodeURI", "decodeURIComponent",
+        "decodeURI",
+        "decodeURIComponent",
         "encodeURI",
         "encodeURIComponent",
 
         // 15.1.4 Constructor Properties of the Global Object
-        "Object", "Function", "Array", "String", "Boolean", "Number", "Date",
-        "RegExp", "Error", "EvalError", "RangeError", "ReferenceError",
-        "SyntaxError", "TypeError", "URIError",
+        "Object",
+        "Function",
+        "Array",
+        "String",
+        "Boolean",
+        "Number",
+        "Date",
+        "RegExp",
+        "Error",
+        "EvalError",
+        "RangeError",
+        "ReferenceError",
+        "SyntaxError",
+        "TypeError",
+        "URIError",
 
         // 15.1.5 Other Properties of the Global Object
         "Math",
@@ -72,83 +87,231 @@
         "arguments",
 
         // B.2 Additional Properties (non-normative)
-        "escape", "unescape",
+        "escape",
+        "unescape",
 
         // Window props (https://developer.mozilla.org/en/DOM/window)
-        "applicationCache", "closed", "Components", "content", "controllers",
-        "crypto", "defaultStatus", "dialogArguments", "directories",
-        "document", "frameElement", "frames", "fullScreen", "globalStorage",
-        "history", "innerHeight", "innerWidth", "length",
-        "location", "locationbar", "localStorage", "menubar",
-        "mozInnerScreenX", "mozInnerScreenY", "mozScreenPixelsPerCssPixel",
-        "name", "navigator", "opener", "outerHeight", "outerWidth",
-        "pageXOffset", "pageYOffset", "parent", "personalbar", "pkcs11",
-        "returnValue", "screen", "scrollbars", "scrollMaxX", "scrollMaxY",
-        "self", "sessionStorage", "sidebar", "status", "statusbar", "toolbar",
-        "top", "window",
+        "applicationCache",
+        "closed",
+        "Components",
+        "content",
+        "controllers",
+        "crypto",
+        "defaultStatus",
+        "dialogArguments",
+        "directories",
+        "document",
+        "frameElement",
+        "frames",
+        "fullScreen",
+        "globalStorage",
+        "history",
+        "innerHeight",
+        "innerWidth",
+        "length",
+        "location",
+        "locationbar",
+        "localStorage",
+        "menubar",
+        "mozInnerScreenX",
+        "mozInnerScreenY",
+        "mozScreenPixelsPerCssPixel",
+        "name",
+        "navigator",
+        "opener",
+        "outerHeight",
+        "outerWidth",
+        "pageXOffset",
+        "pageYOffset",
+        "parent",
+        "personalbar",
+        "pkcs11",
+        "returnValue",
+        "screen",
+        "scrollbars",
+        "scrollMaxX",
+        "scrollMaxY",
+        "self",
+        "sessionStorage",
+        "sidebar",
+        "status",
+        "statusbar",
+        "toolbar",
+        "top",
+        "window",
 
         // Window methods (https://developer.mozilla.org/en/DOM/window)
-        "alert", "addEventListener", "atob", "back", "blur", "btoa",
-        "captureEvents", "clearInterval", "clearTimeout", "close", "confirm",
-        "disableExternalCapture", "dispatchEvent", "dump",
-        "enableExternalCapture", "escape", "find", "focus", "forward",
-        "GeckoActiveXObject", "getAttention", "getAttentionWithCycleCount",
-        "getComputedStyle", "getSelection", "home", "maximize", "minimize",
-        "moveBy", "moveTo", "open", "openDialog", "postMessage", "print",
-        "prompt", "QueryInterface", "releaseEvents", "removeEventListener",
-        "resizeBy", "resizeTo", "restore", "routeEvent", "scroll", "scrollBy",
-        "scrollByLines", "scrollByPages", "scrollTo", "setInterval",
-        "setResizeable", "setTimeout", "showModalDialog", "sizeToContent",
-        "stop", "uuescape", "updateCommands", "XPCNativeWrapper",
+        "alert",
+        "addEventListener",
+        "atob",
+        "back",
+        "blur",
+        "btoa",
+        "captureEvents",
+        "clearInterval",
+        "clearTimeout",
+        "close",
+        "confirm",
+        "disableExternalCapture",
+        "dispatchEvent",
+        "dump",
+        "enableExternalCapture",
+        "escape",
+        "find",
+        "focus",
+        "forward",
+        "GeckoActiveXObject",
+        "getAttention",
+        "getAttentionWithCycleCount",
+        "getComputedStyle",
+        "getSelection",
+        "home",
+        "maximize",
+        "minimize",
+        "moveBy",
+        "moveTo",
+        "open",
+        "openDialog",
+        "postMessage",
+        "print",
+        "prompt",
+        "QueryInterface",
+        "releaseEvents",
+        "removeEventListener",
+        "resizeBy",
+        "resizeTo",
+        "restore",
+        "routeEvent",
+        "scroll",
+        "scrollBy",
+        "scrollByLines",
+        "scrollByPages",
+        "scrollTo",
+        "setInterval",
+        "setResizeable",
+        "setTimeout",
+        "showModalDialog",
+        "sizeToContent",
+        "stop",
+        "uuescape",
+        "updateCommands",
+        "XPCNativeWrapper",
         "XPCSafeJSOjbectWrapper",
 
         // Mozilla Window event handlers, same cite
-        "onabort", "onbeforeunload", "onchange", "onclick", "onclose",
-        "oncontextmenu", "ondragdrop", "onerror", "onfocus", "onhashchange",
-        "onkeydown", "onkeypress", "onkeyup", "onload", "onmousedown",
-        "onmousemove", "onmouseout", "onmouseover", "onmouseup",
-        "onmozorientation", "onpaint", "onreset", "onresize", "onscroll",
-        "onselect", "onsubmit", "onunload",
-        
+        "onabort",
+        "onbeforeunload",
+        "onchange",
+        "onclick",
+        "onclose",
+        "oncontextmenu",
+        "ondragdrop",
+        "onerror",
+        "onfocus",
+        "onhashchange",
+        "onkeydown",
+        "onkeypress",
+        "onkeyup",
+        "onload",
+        "onmousedown",
+        "onmousemove",
+        "onmouseout",
+        "onmouseover",
+        "onmouseup",
+        "onmozorientation",
+        "onpaint",
+        "onreset",
+        "onresize",
+        "onscroll",
+        "onselect",
+        "onsubmit",
+        "onunload",
+
         // Safari Web Content Guide
         // http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/SafariWebContent.pdf
         // WebKit Window member data, from WebKit DOM Reference
         // (http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/WebKitDOMRef/DOMWindow_idl/Classes/DOMWindow/index.html)
         // TODO(fredsa) Many, many more functions and member data to add
-        "ontouchcancel", "ontouchend", "ontouchmove", "ontouchstart",
-        "ongesturestart", "ongesturechange", "ongestureend",
-        
+        "ontouchcancel",
+        "ontouchend",
+        "ontouchmove",
+        "ontouchstart",
+        "ongesturestart",
+        "ongesturechange",
+        "ongestureend",
+
         // extra window methods
         "uneval",
-        
+
         // keywords https://developer.mozilla.org/en/New_in_JavaScript_1.7,
         // https://developer.mozilla.org/en/New_in_JavaScript_1.8.1
-        "getPrototypeOf", "let", 
-        
+        "getPrototypeOf",
+        "let",
+
         // "future reserved words"
-        "abstract", "int", "short", "boolean", "interface", "static", "byte",
-        "long", "char", "final", "native", "synchronized", "float", "package",
-        "throws", "goto", "private", "transient", "implements", "protected",
-        "volatile", "double", "public",
-        
+        "abstract",
+        "int",
+        "short",
+        "boolean",
+        "interface",
+        "static",
+        "byte",
+        "long",
+        "char",
+        "final",
+        "native",
+        "synchronized",
+        "float",
+        "package",
+        "throws",
+        "goto",
+        "private",
+        "transient",
+        "implements",
+        "protected",
+        "volatile",
+        "double",
+        "public",
+
         // IE methods
         // (http://msdn.microsoft.com/en-us/library/ms535873(VS.85).aspx#)
-        "attachEvent", "clientInformation", "clipboardData", "createPopup",
-        "dialogHeight", "dialogLeft", "dialogTop", "dialogWidth",
-        "onafterprint", "onbeforedeactivate", "onbeforeprint",
-        "oncontrolselect", "ondeactivate", "onhelp", "onresizeend", 
+        "attachEvent",
+        "clientInformation",
+        "clipboardData",
+        "createPopup",
+        "dialogHeight",
+        "dialogLeft",
+        "dialogTop",
+        "dialogWidth",
+        "onafterprint",
+        "onbeforedeactivate",
+        "onbeforeprint",
+        "oncontrolselect",
+        "ondeactivate",
+        "onhelp",
+        "onresizeend",
 
         // Common browser-defined identifiers not defined in ECMAScript
-        "event", "external", "Debug", "Enumerator", "Global", "Image",
-        "ActiveXObject", "VBArray", "Components",
+        "event",
+        "external",
+        "Debug",
+        "Enumerator",
+        "Global",
+        "Image",
+        "ActiveXObject",
+        "VBArray",
+        "Components",
 
         // Functions commonly defined on Object
-        "toString", "getClass", "constructor", "prototype",
+        "toString",
+        "getClass",
+        "constructor",
+        "prototype",
 
         // Client-side JavaScript identifiers, which are needed for linkers
         // that don't ensure GWT's window != $wnd, document != $doc, etc.
         // Taken from the Rhino book, pg 715
-        "Anchor", "Applet", "Attr", "Canvas", "CanvasGradient", 
+        "Anchor", "Applet", "Attr", "Canvas", "CanvasGradient",
         "CanvasPattern", "CanvasRenderingContext2D", "CDATASection",
         "CharacterData", "Comment", "CSS2Properties", "CSSRule",
         "CSSStyleSheet", "Document", "DocumentFragment", "DocumentType",
@@ -161,7 +324,7 @@
         "Table", "TableCell", "TableRow", "TableSelection", "Text", "TextArea",
         "UIEvent", "Window", "XMLHttpRequest", "XMLSerializer",
         "XPathException", "XPathResult", "XSLTProcessor",
-        
+
         /*
          * These keywords trigger the loading of the java-plugin. For the
          * next-generation plugin, this results in starting a new Java process.
@@ -170,7 +333,8 @@
         "JavaArray", "JavaMember",
 
         // GWT-defined identifiers
-        "$wnd", "$doc", "$entry", "$moduleName", "$moduleBase", "$gwt_version", "$sessionId",
+        "$wnd", "$doc", "$entry", "$moduleName", "$moduleBase", "$gwt_version",
+        "$sessionId",
 
         // Identifiers used by JsStackEmulator; later set to obfuscatable
         "$stack", "$stackDepth", "$location",
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsScope.java b/dev/core/src/com/google/gwt/dev/js/ast/JsScope.java
index b317f38..5dc5ed9 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsScope.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsScope.java
@@ -28,17 +28,17 @@
 
 /**
  * A scope is a factory for creating and allocating
- * {@link com.google.gwt.dev.js.ast.JsName}s. A JavaScript AST is built in
- * terms of abstract name objects without worrying about obfuscation,
+ * {@link com.google.gwt.dev.js.ast.JsName}s. A JavaScript AST is built in terms
+ * of abstract name objects without worrying about obfuscation,
  * keyword/identifier blacklisting, and so on.
  * 
  * <p>
  * 
- * Scopes are associated with {@link com.google.gwt.dev.js.ast.JsFunction}s,
- * but the two are not equivalent. Functions <i>have</i> scopes, but a scope
- * does not necessarily have an associated Function. Examples of this include
- * the {@link com.google.gwt.dev.js.ast.JsRootScope} and synthetic scopes that
- * might be created by a client.
+ * Scopes are associated with {@link com.google.gwt.dev.js.ast.JsFunction}s, but
+ * the two are not equivalent. Functions <i>have</i> scopes, but a scope does
+ * not necessarily have an associated Function. Examples of this include the
+ * {@link com.google.gwt.dev.js.ast.JsRootScope} and synthetic scopes that might
+ * be created by a client.
  * 
  * <p>
  * 
@@ -46,9 +46,9 @@
  * identifiers for names. Specifically, names in child scopes are chosen such
  * that they do not conflict with names in their parent scopes. The ultimate
  * parent is usually the global scope (see
- * {@link com.google.gwt.dev.js.ast.JsProgram#getGlobalScope()}), but
- * parentless scopes are useful for managing names that are always accessed with
- * a qualifier and could therefore never be confused with the global scope
+ * {@link com.google.gwt.dev.js.ast.JsProgram#getGlobalScope()}), but parentless
+ * scopes are useful for managing names that are always accessed with a
+ * qualifier and could therefore never be confused with the global scope
  * hierarchy.
  */
 public class JsScope implements Serializable {
@@ -162,7 +162,7 @@
    * Returns an iterator for all the names defined by this scope.
    */
   public Iterator<JsName> getAllNames() {
-      return names.values().iterator();
+    return names.values().iterator();
   }
 
   /**
@@ -173,8 +173,8 @@
   }
 
   /**
-   * Returns the parent scope of this scope, or <code>null</code> if this is
-   * the root scope.
+   * Returns the parent scope of this scope, or <code>null</code> if this is the
+   * root scope.
    */
   public final JsScope getParent() {
     return parent;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsStatement.java b/dev/core/src/com/google/gwt/dev/js/ast/JsStatement.java
index 3043cc1..6691c76 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsStatement.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsStatement.java
@@ -20,7 +20,7 @@
 /**
  * Abstract base class for JavaScript statement objects.
  */
-public abstract class JsStatement extends JsNode<JsStatement> {
+public abstract class JsStatement extends JsNode {
 
   protected JsStatement(SourceInfo sourceInfo) {
     super(sourceInfo);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsStringLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsStringLiteral.java
index f6fd8cc..6691d80 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsStringLiteral.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsStringLiteral.java
@@ -53,7 +53,7 @@
     return false;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     v.visit(this, ctx);
     v.endVisit(this, ctx);
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsSwitch.java b/dev/core/src/com/google/gwt/dev/js/ast/JsSwitch.java
index 6e4d038..16341ab 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsSwitch.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsSwitch.java
@@ -45,7 +45,7 @@
     this.expr = expr;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       expr = v.accept(expr);
       v.acceptWithInsertRemove(cases);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsSwitchMember.java b/dev/core/src/com/google/gwt/dev/js/ast/JsSwitchMember.java
index 26bee44..113901d 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsSwitchMember.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsSwitchMember.java
@@ -23,7 +23,7 @@
 /**
  * A member/case in a JavaScript switch object.
  */
-public abstract class JsSwitchMember extends JsNode<JsSwitchMember> {
+public abstract class JsSwitchMember extends JsNode {
 
   protected final List<JsStatement> stmts = new ArrayList<JsStatement>();
 
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsThisRef.java b/dev/core/src/com/google/gwt/dev/js/ast/JsThisRef.java
index 356bec3..3f4ed82 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsThisRef.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsThisRef.java
@@ -49,7 +49,7 @@
     return false;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     v.visit(this, ctx);
     v.endVisit(this, ctx);
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsThrow.java b/dev/core/src/com/google/gwt/dev/js/ast/JsThrow.java
index 17f98ce..6b45f97 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsThrow.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsThrow.java
@@ -41,7 +41,7 @@
     this.expr = expr;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       expr = v.accept(expr);
     }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsTry.java b/dev/core/src/com/google/gwt/dev/js/ast/JsTry.java
index ae7ec34..35ca695 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsTry.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsTry.java
@@ -55,7 +55,7 @@
     tryBlock = block;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       tryBlock = v.accept(tryBlock);
       v.acceptWithInsertRemove(catches);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperation.java b/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperation.java
index 4feadb6..bf323ce 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperation.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperation.java
@@ -54,7 +54,7 @@
     this.arg = arg;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (op.isModifying()) {
       /*
        * The delete operator is practically like an assignment of undefined, so
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperator.java b/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperator.java
index 66abc96..454a1df 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperator.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperator.java
@@ -25,9 +25,9 @@
    */
 
   BIT_NOT("~", 14, PREFIX), DEC("--", 14, POSTFIX | PREFIX), DELETE("delete",
-      14, PREFIX), INC("++", 14, POSTFIX | PREFIX), NEG("-", 14, PREFIX),
-      POS("+", 14, PREFIX), NOT("!", 14, PREFIX), 
-      TYPEOF("typeof", 14, PREFIX), VOID("void", 14, PREFIX);
+      14, PREFIX), INC("++", 14, POSTFIX | PREFIX), NEG("-", 14, PREFIX), POS(
+      "+", 14, PREFIX), NOT("!", 14, PREFIX), TYPEOF("typeof", 14, PREFIX), VOID(
+      "void", 14, PREFIX);
 
   private final int mask;
 
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsVars.java b/dev/core/src/com/google/gwt/dev/js/ast/JsVars.java
index 5b37e06..2e55e33 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsVars.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsVars.java
@@ -29,7 +29,7 @@
   /**
    * A var declared using the JavaScript <code>var</code> statement.
    */
-  public static class JsVar extends JsNode<JsVar> implements HasName {
+  public static class JsVar extends JsNode implements HasName {
 
     private JsExpression initExpr;
 
@@ -52,7 +52,7 @@
       this.initExpr = initExpr;
     }
 
-    public void traverse(JsVisitor v, JsContext<JsVar> ctx) {
+    public void traverse(JsVisitor v, JsContext ctx) {
       if (v.visit(this, ctx)) {
         if (initExpr != null) {
           initExpr = v.accept(initExpr);
@@ -85,7 +85,7 @@
     return vars.iterator();
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       v.acceptWithInsertRemove(vars);
     }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsVisitable.java b/dev/core/src/com/google/gwt/dev/js/ast/JsVisitable.java
index 2a111f7..cd37d2f 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsVisitable.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsVisitable.java
@@ -17,10 +17,8 @@
 
 /**
  * Abstracts the idea that a class can be traversed.
- * 
- * @param <T>
  */
-public interface JsVisitable<T extends JsVisitable<T>> {
+public interface JsVisitable {
 
   /**
    * Causes this object to have the visitor visit itself and its children.
@@ -28,5 +26,5 @@
    * @param visitor the visitor that should traverse this node
    * @param ctx the context of an existing traversal
    */
-  void traverse(JsVisitor visitor, JsContext<T> ctx);
+  void traverse(JsVisitor visitor, JsContext ctx);
 }
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsVisitor.java b/dev/core/src/com/google/gwt/dev/js/ast/JsVisitor.java
index 3292713..e64799f 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsVisitor.java
@@ -28,7 +28,7 @@
 @SuppressWarnings("unused")
 public class JsVisitor {
 
-  protected static final JsContext<JsExpression> LVALUE_CONTEXT = new JsContext<JsExpression>() {
+  protected static final JsContext LVALUE_CONTEXT = new JsContext() {
 
     public boolean canInsert() {
       return false;
@@ -38,11 +38,11 @@
       return false;
     }
 
-    public void insertAfter(JsExpression node) {
+    public void insertAfter(JsVisitable node) {
       throw new UnsupportedOperationException();
     }
 
-    public void insertBefore(JsExpression node) {
+    public void insertBefore(JsVisitable node) {
       throw new UnsupportedOperationException();
     }
 
@@ -54,12 +54,11 @@
       throw new UnsupportedOperationException();
     }
 
-    public void replaceMe(JsExpression node) {
+    public void replaceMe(JsVisitable node) {
       throw new UnsupportedOperationException();
     }
   };
 
-  @SuppressWarnings("unchecked")
   protected static final JsContext UNMODIFIABLE_CONTEXT = new JsContext() {
 
     public boolean canInsert() {
@@ -91,14 +90,14 @@
     }
   };
 
-  @SuppressWarnings("unchecked")
+  @SuppressWarnings("cast")
   public final <T extends JsVisitable> T accept(T node) {
     // The following cast to T is needed for javac 1.5.0_13
     // as shipped on OS X
     return (T) doAccept(node);
   }
 
-  public final <T extends JsVisitable<T>> void acceptList(List<T> collection) {
+  public final <T extends JsVisitable> void acceptList(List<T> collection) {
     doAcceptList(collection);
   }
 
@@ -106,7 +105,7 @@
     return doAcceptLvalue(expr);
   }
 
-  public final <T extends JsVisitable<T>> void acceptWithInsertRemove(
+  public final <T extends JsVisitable> void acceptWithInsertRemove(
       List<T> collection) {
     doAcceptWithInsertRemove(collection);
   }
@@ -115,319 +114,315 @@
     throw new UnsupportedOperationException();
   }
 
-  public void endVisit(JsArrayAccess x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsArrayAccess x, JsContext ctx) {
   }
 
-  public void endVisit(JsArrayLiteral x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsArrayLiteral x, JsContext ctx) {
   }
 
-  public void endVisit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsBinaryOperation x, JsContext ctx) {
   }
 
-  public void endVisit(JsBlock x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsBlock x, JsContext ctx) {
   }
 
-  public void endVisit(JsBooleanLiteral x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsBooleanLiteral x, JsContext ctx) {
   }
 
-  public void endVisit(JsBreak x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsBreak x, JsContext ctx) {
   }
 
-  public void endVisit(JsCase x, JsContext<JsSwitchMember> ctx) {
+  public void endVisit(JsCase x, JsContext ctx) {
   }
 
-  public void endVisit(JsCatch x, JsContext<JsCatch> ctx) {
+  public void endVisit(JsCatch x, JsContext ctx) {
   }
 
-  public void endVisit(JsConditional x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsConditional x, JsContext ctx) {
   }
 
-  public void endVisit(JsContinue x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsContinue x, JsContext ctx) {
   }
 
-  public void endVisit(JsDebugger x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsDebugger x, JsContext ctx) {
   }
 
-  public void endVisit(JsDefault x, JsContext<JsSwitchMember> ctx) {
+  public void endVisit(JsDefault x, JsContext ctx) {
   }
 
-  public void endVisit(JsDoWhile x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsDoWhile x, JsContext ctx) {
   }
 
-  public void endVisit(JsEmpty x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsEmpty x, JsContext ctx) {
   }
 
-  public void endVisit(JsExprStmt x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsExprStmt x, JsContext ctx) {
   }
 
-  public void endVisit(JsFor x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsFor x, JsContext ctx) {
   }
 
-  public void endVisit(JsForIn x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsForIn x, JsContext ctx) {
   }
 
-  public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsFunction x, JsContext ctx) {
   }
 
-  public void endVisit(JsIf x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsIf x, JsContext ctx) {
   }
 
-  public void endVisit(JsInvocation x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsInvocation x, JsContext ctx) {
   }
 
-  public void endVisit(JsLabel x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsLabel x, JsContext ctx) {
   }
 
-  public void endVisit(JsNameOf x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsNameOf x, JsContext ctx) {
   }
 
-  public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsNameRef x, JsContext ctx) {
   }
 
-  public void endVisit(JsNew x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsNew x, JsContext ctx) {
   }
 
-  public void endVisit(JsNullLiteral x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsNullLiteral x, JsContext ctx) {
   }
 
-  public void endVisit(JsNumberLiteral x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsNumberLiteral x, JsContext ctx) {
   }
 
-  public void endVisit(JsObjectLiteral x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsObjectLiteral x, JsContext ctx) {
   }
 
-  public void endVisit(JsParameter x, JsContext<JsParameter> ctx) {
+  public void endVisit(JsParameter x, JsContext ctx) {
   }
 
-  public void endVisit(JsPostfixOperation x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsPostfixOperation x, JsContext ctx) {
   }
 
-  public void endVisit(JsPrefixOperation x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsPrefixOperation x, JsContext ctx) {
   }
 
-  public void endVisit(JsProgram x, JsContext<JsProgram> ctx) {
+  public void endVisit(JsProgram x, JsContext ctx) {
   }
 
-  public void endVisit(JsProgramFragment x, JsContext<JsProgramFragment> ctx) {
+  public void endVisit(JsProgramFragment x, JsContext ctx) {
   }
 
-  public void endVisit(JsPropertyInitializer x,
-      JsContext<JsPropertyInitializer> ctx) {
+  public void endVisit(JsPropertyInitializer x, JsContext ctx) {
   }
 
-  public void endVisit(JsRegExp x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsRegExp x, JsContext ctx) {
   }
 
-  public void endVisit(JsReturn x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsReturn x, JsContext ctx) {
   }
 
-  public void endVisit(JsStringLiteral x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsStringLiteral x, JsContext ctx) {
   }
 
-  public void endVisit(JsSwitch x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsSwitch x, JsContext ctx) {
   }
 
-  public void endVisit(JsThisRef x, JsContext<JsExpression> ctx) {
+  public void endVisit(JsThisRef x, JsContext ctx) {
   }
 
-  public void endVisit(JsThrow x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsThrow x, JsContext ctx) {
   }
 
-  public void endVisit(JsTry x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsTry x, JsContext ctx) {
   }
 
-  public void endVisit(JsVar x, JsContext<JsVar> ctx) {
+  public void endVisit(JsVar x, JsContext ctx) {
   }
 
-  public void endVisit(JsVars x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsVars x, JsContext ctx) {
   }
 
-  public void endVisit(JsWhile x, JsContext<JsStatement> ctx) {
+  public void endVisit(JsWhile x, JsContext ctx) {
   }
 
-  public boolean visit(JsArrayAccess x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsArrayAccess x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsArrayLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsArrayLiteral x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsBinaryOperation x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsBlock x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsBlock x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsBooleanLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsBooleanLiteral x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsBreak x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsBreak x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsCase x, JsContext<JsSwitchMember> ctx) {
+  public boolean visit(JsCase x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsCatch x, JsContext<JsCatch> ctx) {
+  public boolean visit(JsCatch x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsConditional x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsConditional x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsContinue x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsContinue x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsDebugger x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsDebugger x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsDefault x, JsContext<JsSwitchMember> ctx) {
+  public boolean visit(JsDefault x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsDoWhile x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsDoWhile x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsEmpty x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsEmpty x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsExprStmt x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsExprStmt x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsFor x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsFor x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsForIn x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsForIn x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsFunction x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsIf x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsIf x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsInvocation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsInvocation x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsLabel x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsLabel x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsNameOf x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNameOf x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsNameRef x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNameRef x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsNew x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNew x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsNullLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNullLiteral x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsNumberLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNumberLiteral x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsObjectLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsObjectLiteral x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsParameter x, JsContext<JsParameter> ctx) {
+  public boolean visit(JsParameter x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsPostfixOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsPostfixOperation x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsPrefixOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsPrefixOperation x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsProgram x, JsContext<JsProgram> ctx) {
+  public boolean visit(JsProgram x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsProgramFragment x, JsContext<JsProgramFragment> ctx) {
+  public boolean visit(JsProgramFragment x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsPropertyInitializer x,
-      JsContext<JsPropertyInitializer> ctx) {
+  public boolean visit(JsPropertyInitializer x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsRegExp x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsRegExp x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsReturn x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsReturn x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsStringLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsStringLiteral x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsSwitch x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsSwitch x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsThisRef x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsThisRef x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsThrow x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsThrow x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsTry x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsTry x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsVar x, JsContext<JsVar> ctx) {
+  public boolean visit(JsVar x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsVars x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsVars x, JsContext ctx) {
     return true;
   }
 
-  public boolean visit(JsWhile x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsWhile x, JsContext ctx) {
     return true;
   }
 
-  @SuppressWarnings({"unchecked", "cast"})
-  protected <T extends JsVisitable<T>> T doAccept(T node) {
-    doTraverse(node, (JsContext<T>) UNMODIFIABLE_CONTEXT);
+  protected <T extends JsVisitable> T doAccept(T node) {
+    doTraverse(node, UNMODIFIABLE_CONTEXT);
     return node;
   }
 
-  @SuppressWarnings({"unchecked", "cast"})
-  protected <T extends JsVisitable<T>> void doAcceptList(List<T> collection) {
+  protected <T extends JsVisitable> void doAcceptList(List<T> collection) {
     for (Iterator<T> it = collection.iterator(); it.hasNext();) {
-      doTraverse(it.next(), (JsContext<T>) UNMODIFIABLE_CONTEXT);
+      doTraverse(it.next(), UNMODIFIABLE_CONTEXT);
     }
   }
 
@@ -436,16 +431,14 @@
     return expr;
   }
 
-  @SuppressWarnings({"unchecked", "cast"})
-  protected <T extends JsVisitable<T>> void doAcceptWithInsertRemove(
+  protected <T extends JsVisitable> void doAcceptWithInsertRemove(
       List<T> collection) {
     for (Iterator<T> it = collection.iterator(); it.hasNext();) {
-      doTraverse(it.next(), (JsContext<T>) UNMODIFIABLE_CONTEXT);
+      doTraverse(it.next(), UNMODIFIABLE_CONTEXT);
     }
   }
 
-  protected final <T extends JsVisitable<T>> void doTraverse(T node,
-      JsContext<T> ctx) {
+  protected final <T extends JsVisitable> void doTraverse(T node, JsContext ctx) {
     try {
       node.traverse(this, ctx);
     } catch (Throwable e) {
@@ -453,8 +446,8 @@
     }
   }
 
-  private <T extends JsVisitable<T>> InternalCompilerException translateException(
-      T node, Throwable e) {
+  private InternalCompilerException translateException(JsVisitable node,
+      Throwable e) {
     if (e instanceof VirtualMachineError) {
       // Always rethrow VM errors (an attempt to wrap may fail).
       throw (VirtualMachineError) e;
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsWhile.java b/dev/core/src/com/google/gwt/dev/js/ast/JsWhile.java
index 5bed233..af2b9d0 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsWhile.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsWhile.java
@@ -52,7 +52,7 @@
     this.condition = condition;
   }
 
-  public void traverse(JsVisitor v, JsContext<JsStatement> ctx) {
+  public void traverse(JsVisitor v, JsContext ctx) {
     if (v.visit(this, ctx)) {
       condition = v.accept(condition);
       body = v.accept(body);
diff --git a/dev/core/src/com/google/gwt/dev/shell/Jsni.java b/dev/core/src/com/google/gwt/dev/shell/Jsni.java
index 19bd33d..a5a2d45 100644
--- a/dev/core/src/com/google/gwt/dev/shell/Jsni.java
+++ b/dev/core/src/com/google/gwt/dev/shell/Jsni.java
@@ -43,7 +43,8 @@
   /**
    * Generate source code, fixing up any JSNI references for hosted mode.
    * 
-   * <p/><table>
+   * <p/>
+   * <table>
    * <tr>
    * <td>Original</td>
    * <td>Becomes</td>
@@ -98,7 +99,7 @@
      * This will handle references to fields or tear-offs of Java methods.
      */
     @Override
-    public boolean visit(JsNameRef x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsNameRef x, JsContext ctx) {
       String ident = x.getIdent();
       JsExpression q = x.getQualifier();
       if (ident.startsWith("@")) {
@@ -110,15 +111,14 @@
         } else {
           member = dispatchInfo.getClassInfoByDispId(dispId).getMember(dispId);
         }
-        
+
         if (member == null) {
           throw new HostedModeException(
               "JSNI rewriter found reference to non-existent field in a field reference or java method tear-off: "
                   + ident + " at " + x.getSourceInfo());
         }
 
-        if (member instanceof Field
-            || member instanceof SyntheticClassMember) {
+        if (member instanceof Field || member instanceof SyntheticClassMember) {
           if (q != null) {
             accept(q);
             out.print("[");
@@ -167,7 +167,7 @@
      * correctly on some browsers.
      */
     @Override
-    public boolean visit(JsInvocation x, JsContext<JsExpression> ctx) {
+    public boolean visit(JsInvocation x, JsContext ctx) {
       if (x.getQualifier() instanceof JsNameRef) {
         JsNameRef ref = (JsNameRef) x.getQualifier();
         String ident = ref.getIdent();
@@ -186,14 +186,13 @@
                 "JSNI rewriter found reference to non-existent field in a method invocation: "
                     + ref.getIdent() + " at " + ref.getSourceInfo());
           }
-          
+
           /*
            * Make sure the ident is a reference to a method or constructor and
            * not a reference to a field whose contents (e.g. a Function) we
            * intend to immediately invoke.
            * 
            * p.C::method()(); versus p.C::field();
-           *
            */
           if (member instanceof Method || member instanceof Constructor<?>) {
 
@@ -256,7 +255,7 @@
    * JSNI idents have been replaced with legal JavaScript for hosted mode.
    */
   private static String generateJavaScriptForHostedMode(
-      DispatchIdOracle dispatchInfo, JsProgram program, JsNode<?> node) {
+      DispatchIdOracle dispatchInfo, JsProgram program, JsNode node) {
     DefaultTextOutput out = new DefaultTextOutput(false);
     JsSourceGenWithJsniIdentFixup vi = new JsSourceGenWithJsniIdentFixup(out,
         dispatchInfo, program);
diff --git a/dev/core/test/com/google/gwt/dev/javac/JsniCollectorTest.java b/dev/core/test/com/google/gwt/dev/javac/JsniCollectorTest.java
index 33d8d61..afe4107 100644
--- a/dev/core/test/com/google/gwt/dev/javac/JsniCollectorTest.java
+++ b/dev/core/test/com/google/gwt/dev/javac/JsniCollectorTest.java
@@ -18,7 +18,6 @@
 import com.google.gwt.dev.javac.impl.StaticJavaResource;
 import com.google.gwt.dev.jjs.SourceInfo;
 import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsNameRef;
 import com.google.gwt.dev.js.ast.JsVisitor;
 
@@ -125,7 +124,7 @@
     final List<JsNameRef> foundRefs = new ArrayList<JsNameRef>();
     new JsVisitor() {
       @Override
-      public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
+      public void endVisit(JsNameRef x, JsContext ctx) {
         if (x.getIdent().startsWith("@")) {
           foundRefs.add(x);
         }
diff --git a/dev/core/test/com/google/gwt/dev/js/ComparingVisitor.java b/dev/core/test/com/google/gwt/dev/js/ComparingVisitor.java
index 76dae3d..a7c91d0 100644
--- a/dev/core/test/com/google/gwt/dev/js/ComparingVisitor.java
+++ b/dev/core/test/com/google/gwt/dev/js/ComparingVisitor.java
@@ -28,12 +28,10 @@
 import com.google.gwt.dev.js.ast.JsContext;
 import com.google.gwt.dev.js.ast.JsContinue;
 import com.google.gwt.dev.js.ast.JsDebugger;
-import com.google.gwt.dev.js.ast.JsNumberLiteral;
 import com.google.gwt.dev.js.ast.JsDefault;
 import com.google.gwt.dev.js.ast.JsDoWhile;
 import com.google.gwt.dev.js.ast.JsEmpty;
 import com.google.gwt.dev.js.ast.JsExprStmt;
-import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsFor;
 import com.google.gwt.dev.js.ast.JsForIn;
 import com.google.gwt.dev.js.ast.JsFunction;
@@ -44,6 +42,7 @@
 import com.google.gwt.dev.js.ast.JsNameRef;
 import com.google.gwt.dev.js.ast.JsNew;
 import com.google.gwt.dev.js.ast.JsNullLiteral;
+import com.google.gwt.dev.js.ast.JsNumberLiteral;
 import com.google.gwt.dev.js.ast.JsObjectLiteral;
 import com.google.gwt.dev.js.ast.JsParameter;
 import com.google.gwt.dev.js.ast.JsPostfixOperation;
@@ -55,15 +54,14 @@
 import com.google.gwt.dev.js.ast.JsStatement;
 import com.google.gwt.dev.js.ast.JsStringLiteral;
 import com.google.gwt.dev.js.ast.JsSwitch;
-import com.google.gwt.dev.js.ast.JsSwitchMember;
 import com.google.gwt.dev.js.ast.JsThisRef;
 import com.google.gwt.dev.js.ast.JsThrow;
 import com.google.gwt.dev.js.ast.JsTry;
 import com.google.gwt.dev.js.ast.JsVars;
+import com.google.gwt.dev.js.ast.JsVars.JsVar;
 import com.google.gwt.dev.js.ast.JsVisitable;
 import com.google.gwt.dev.js.ast.JsVisitor;
 import com.google.gwt.dev.js.ast.JsWhile;
-import com.google.gwt.dev.js.ast.JsVars.JsVar;
 
 import junit.framework.Assert;
 import junit.framework.TestCase;
@@ -78,7 +76,7 @@
     compare(expectedTree, actualTree);
   }
 
-  private static void compare(JsVisitable<?> expected, JsVisitable<?> actual) {
+  private static void compare(JsVisitable expected, JsVisitable actual) {
     if (expected == actual) {
       return;
     }
@@ -104,24 +102,24 @@
    */
   private final JsVisitable other;
 
-  private ComparingVisitor(JsVisitable<?> other) {
+  private ComparingVisitor(JsVisitable other) {
     this.other = other;
   }
 
   @Override
-  public boolean visit(JsArrayAccess x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsArrayAccess x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsArrayAccess);
     return false;
   }
 
   @Override
-  public boolean visit(JsArrayLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsArrayLiteral x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsArrayLiteral);
     return false;
   }
 
   @Override
-  public boolean visit(JsBinaryOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsBinaryOperation x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsBinaryOperation);
     Assert.assertEquals(((JsBinaryOperation) other).getOperator().getSymbol(),
         x.getOperator().getSymbol());
@@ -129,21 +127,21 @@
   }
 
   @Override
-  public boolean visit(JsBlock x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsBlock x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsBlock);
     Assert.assertEquals(((JsBlock) other).isGlobalBlock(), x.isGlobalBlock());
     return false;
   }
 
   @Override
-  public boolean visit(JsBooleanLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsBooleanLiteral x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsBooleanLiteral);
     Assert.assertEquals(((JsBooleanLiteral) other).getValue(), x.getValue());
     return false;
   }
 
   @Override
-  public boolean visit(JsBreak x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsBreak x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsBreak);
     Assert.assertEquals(((JsBreak) other).getLabel().getIdent(),
         x.getLabel().getIdent());
@@ -151,13 +149,13 @@
   }
 
   @Override
-  public boolean visit(JsCase x, JsContext<JsSwitchMember> ctx) {
+  public boolean visit(JsCase x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsCase);
     return false;
   }
 
   @Override
-  public boolean visit(JsCatch x, JsContext<JsCatch> ctx) {
+  public boolean visit(JsCatch x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsCatch);
     Assert.assertEquals(((JsCatch) other).getParameter().getName().getIdent(),
         x.getParameter().getName().getIdent());
@@ -165,13 +163,13 @@
   }
 
   @Override
-  public boolean visit(JsConditional x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsConditional x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsConditional);
     return false;
   }
 
   @Override
-  public boolean visit(JsContinue x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsContinue x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsContinue);
     Assert.assertEquals(((JsContinue) other).getLabel().getIdent(),
         x.getLabel().getIdent());
@@ -179,49 +177,49 @@
   }
 
   @Override
-  public boolean visit(JsDebugger x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsDebugger x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsDebugger);
     return false;
   }
 
   @Override
-  public boolean visit(JsDefault x, JsContext<JsSwitchMember> ctx) {
+  public boolean visit(JsDefault x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsDefault);
     return false;
   }
 
   @Override
-  public boolean visit(JsDoWhile x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsDoWhile x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsDoWhile);
     return false;
   }
 
   @Override
-  public boolean visit(JsEmpty x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsEmpty x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsEmpty);
     return false;
   }
 
   @Override
-  public boolean visit(JsExprStmt x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsExprStmt x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsExprStmt);
     return false;
   }
 
   @Override
-  public boolean visit(JsFor x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsFor x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsFor);
     return false;
   }
 
   @Override
-  public boolean visit(JsForIn x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsForIn x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsForIn);
     return false;
   }
 
   @Override
-  public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsFunction x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsFunction);
     JsFunction otherFunc = (JsFunction) other;
     JsName otherName = otherFunc.getName();
@@ -233,19 +231,19 @@
   }
 
   @Override
-  public boolean visit(JsIf x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsIf x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsIf);
     return false;
   }
 
   @Override
-  public boolean visit(JsInvocation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsInvocation x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsInvocation);
     return false;
   }
 
   @Override
-  public boolean visit(JsLabel x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsLabel x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsLabel);
     Assert.assertEquals(((JsLabel) other).getName().getIdent(),
         x.getName().getIdent());
@@ -253,39 +251,39 @@
   }
 
   @Override
-  public boolean visit(JsNameRef x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNameRef x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsNameRef);
     Assert.assertEquals(((JsNameRef) other).getIdent(), x.getIdent());
     return false;
   }
 
   @Override
-  public boolean visit(JsNew x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNew x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsNew);
     return false;
   }
 
   @Override
-  public boolean visit(JsNullLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNullLiteral x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsNullLiteral);
     return false;
   }
 
   @Override
-  public boolean visit(JsNumberLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsNumberLiteral x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsNumberLiteral);
     Assert.assertEquals(((JsNumberLiteral) other).getValue(), x.getValue());
     return false;
   }
 
   @Override
-  public boolean visit(JsObjectLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsObjectLiteral x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsObjectLiteral);
     return false;
   }
 
   @Override
-  public boolean visit(JsParameter x, JsContext<JsParameter> ctx) {
+  public boolean visit(JsParameter x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsParameter);
     Assert.assertEquals(((JsParameter) other).getName().getIdent(),
         x.getName().getIdent());
@@ -293,7 +291,7 @@
   }
 
   @Override
-  public boolean visit(JsPostfixOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsPostfixOperation x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsPostfixOperation);
     Assert.assertEquals(((JsPostfixOperation) other).getOperator().getSymbol(),
         x.getOperator().getSymbol());
@@ -301,7 +299,7 @@
   }
 
   @Override
-  public boolean visit(JsPrefixOperation x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsPrefixOperation x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsPrefixOperation);
     Assert.assertEquals(((JsPrefixOperation) other).getOperator().getSymbol(),
         x.getOperator().getSymbol());
@@ -309,20 +307,19 @@
   }
 
   @Override
-  public boolean visit(JsProgram x, JsContext<JsProgram> ctx) {
+  public boolean visit(JsProgram x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsProgram);
     return false;
   }
 
   @Override
-  public boolean visit(JsPropertyInitializer x,
-      JsContext<JsPropertyInitializer> ctx) {
+  public boolean visit(JsPropertyInitializer x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsPropertyInitializer);
     return false;
   }
 
   @Override
-  public boolean visit(JsRegExp x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsRegExp x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsRegExp);
     Assert.assertEquals(((JsRegExp) other).getFlags(), x.getFlags());
     Assert.assertEquals(((JsRegExp) other).getPattern(), x.getPattern());
@@ -330,56 +327,56 @@
   }
 
   @Override
-  public boolean visit(JsReturn x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsReturn x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsReturn);
     return false;
   }
 
   @Override
-  public boolean visit(JsStringLiteral x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsStringLiteral x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsStringLiteral);
     Assert.assertEquals(((JsStringLiteral) other).getValue(), x.getValue());
     return false;
   }
 
   @Override
-  public boolean visit(JsSwitch x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsSwitch x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsSwitch);
     return false;
   }
 
   @Override
-  public boolean visit(JsThisRef x, JsContext<JsExpression> ctx) {
+  public boolean visit(JsThisRef x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsThisRef);
     return false;
   }
 
   @Override
-  public boolean visit(JsThrow x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsThrow x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsThrow);
     return false;
   }
 
   @Override
-  public boolean visit(JsTry x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsTry x, JsContext ctx) {
     Assert.assertTrue(other instanceof JsTry);
     return false;
   }
 
   @Override
-  public boolean visit(JsVar x, JsContext<JsVar> ctx) {
+  public boolean visit(JsVar x, JsContext ctx) {
     TestCase.assertTrue(other instanceof JsVar);
     TestCase.assertEquals(((JsVar) other).getName().getIdent(),
         x.getName().getIdent());
     return false;
   }
 
-  public boolean visit(JsVars x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsVars x, JsContext ctx) {
     TestCase.assertTrue(other instanceof JsVars);
     return false;
   }
 
-  public boolean visit(JsWhile x, JsContext<JsStatement> ctx) {
+  public boolean visit(JsWhile x, JsContext ctx) {
     TestCase.assertTrue(other instanceof JsWhile);
     return false;
   }
diff --git a/dev/core/test/com/google/gwt/dev/js/FlatteningVisitor.java b/dev/core/test/com/google/gwt/dev/js/FlatteningVisitor.java
index 1dc0dbf..b7b99ec 100644
--- a/dev/core/test/com/google/gwt/dev/js/FlatteningVisitor.java
+++ b/dev/core/test/com/google/gwt/dev/js/FlatteningVisitor.java
@@ -32,10 +32,10 @@
   }
 
   public static class TreeNode {
-    public final JsVisitable<?> node;
+    public final JsVisitable node;
     public final List<TreeNode> children = new ArrayList<TreeNode>();
 
-    public TreeNode(JsVisitable<?> node) {
+    public TreeNode(JsVisitable node) {
       this.node = node;
     }
   }
@@ -46,7 +46,7 @@
     root = new TreeNode(null);
   }
 
-  protected <T extends JsVisitable<T>> T doAccept(T node) {
+  protected <T extends JsVisitable> T doAccept(T node) {
     TreeNode oldRoot = root;
     root = new TreeNode(node);
     oldRoot.children.add(root);
@@ -55,7 +55,7 @@
     return node;
   }
 
-  protected <T extends JsVisitable<T>> void doAcceptList(List<T> collection) {
+  protected <T extends JsVisitable> void doAcceptList(List<T> collection) {
     for (Iterator<T> it = collection.iterator(); it.hasNext();) {
       doAccept(it.next());
     }
diff --git a/dev/core/test/com/google/gwt/dev/js/JsInlinerTest.java b/dev/core/test/com/google/gwt/dev/js/JsInlinerTest.java
index cb1f37b..fdecc01 100644
--- a/dev/core/test/com/google/gwt/dev/js/JsInlinerTest.java
+++ b/dev/core/test/com/google/gwt/dev/js/JsInlinerTest.java
@@ -16,7 +16,6 @@
 package com.google.gwt.dev.js;
 
 import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsFunction;
 import com.google.gwt.dev.js.ast.JsModVisitor;
 import com.google.gwt.dev.js.ast.JsName;
@@ -29,14 +28,18 @@
 
   private static class FixStaticRefsVisitor extends JsModVisitor {
 
+    /**
+     * Called reflectively.
+     */
+    @SuppressWarnings("unused")
     public static void exec(JsProgram program) {
       (new FixStaticRefsVisitor()).accept(program);
     }
 
     @Override
-    public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
+    public void endVisit(JsFunction x, JsContext ctx) {
       JsName name = x.getName();
-      if (name != null) { 
+      if (name != null) {
         name.setStaticRef(x);
       }
     }
@@ -56,15 +59,16 @@
         + "function b1() { var x=a1(function blah(){}, 10); } b1();";
     compare(input2, input2);
   }
-  
+
   public void testInlineObjectLiterals() throws Exception {
     String input = "function a1(arg, x) { arg.x = x; return arg; }"
         + "function b1() { var x=a1({}, 10); } b1();";
     compare(input, input);
   }
+
   /**
    * A test for mutually-recursive functions. Setup:
-   *
+   * 
    * <pre>
    * a -> b, c
    * b -> a, c
diff --git a/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorAccuracyTest.java b/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorAccuracyTest.java
index b1a2002..590ffe4 100644
--- a/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorAccuracyTest.java
+++ b/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorAccuracyTest.java
@@ -16,10 +16,8 @@
 package com.google.gwt.dev.js;
 
 import com.google.gwt.dev.jjs.SourceOrigin;
-import com.google.gwt.dev.jjs.ast.JStringLiteral;
 import com.google.gwt.dev.js.ast.JsProgram;
 import com.google.gwt.dev.js.ast.JsStatement;
-import com.google.gwt.dev.js.ast.JsStringLiteral;
 import com.google.gwt.dev.js.ast.JsVisitor;
 import com.google.gwt.dev.util.DefaultTextOutput;
 import com.google.gwt.dev.util.TextOutput;
@@ -105,7 +103,7 @@
   public void testNumberLiteralNameRef() throws Exception {
     doTest("(42).nameRef");
   }
-  
+
   public void testObjectDeclarationArrayAccess() throws Exception {
     doTest("({ a : 'b'})['a']");
   }
@@ -140,10 +138,10 @@
     // + prefix not stripped when operand is not literal number
     doTest("var x = +y", "var x = +y");
     // + prefix stripped when operand is literal number
-    doTest("var x = +42","var x = 42");
+    doTest("var x = +42", "var x = 42");
   }
-  
-  public void testEscapes() throws Exception {
+
+  public void testEscapes() {
     // Use short octal escapes at the end of the string or when the next
     // character is a non-digit
     doTestEscapes("\u0000", "'\\0'");
@@ -161,16 +159,16 @@
         "'\\0\\1\\2\\3\\4\\5\\6\\7'");
     doTestEscapes("\u0008\u0009\n\u000b\u000c\r\u000e\u000f",
         "'\\b\\t\\n\\13\\f\\r\\16\\17'");
-    
+
     // Use two-digit octal escapes for characters from 16 to 31
     doTestEscapes("\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017",
         "'\\20\\21\\22\\23\\24\\25\\26\\27'");
     doTestEscapes("\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f",
         "'\\30\\31\\32\\33\\34\\35\\36\\37'");
-    
+
     // Use two-digit hex escapes for characters up to 0xff
     doTestEscapes("\u007f\u00ab", "'\\x7F\\xAB'");
-    
+
     // Use four-digit unicode escapes for characters from 0x100 up
     doTestEscapes("\u0100\u117f\u2345", "'\\u0100\\u117F\\u2345'");
   }
@@ -192,10 +190,10 @@
         new JsProgram().getScope(), new StringReader(expectedJs));
     ComparingVisitor.exec(expected, actual);
   }
-  
-  private void doTestEscapes(String value, String expected) throws Exception {
-    String actual =
-      new JsProgram().getStringLiteral(SourceOrigin.UNKNOWN, value).toString();
+
+  private void doTestEscapes(String value, String expected) {
+    String actual = new JsProgram().getStringLiteral(SourceOrigin.UNKNOWN,
+        value).toString();
     assertEquals(expected, actual);
   }
 
