Rolling back Generator Result Caching for RPC (issues have been identified)

Review at http://gwt-code-reviews.appspot.com/1241801

Review by: zundel@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9477 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java b/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
index 19e33bc..644501d 100644
--- a/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
+++ b/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
@@ -19,7 +19,7 @@
 import com.google.gwt.core.client.impl.ArtificialRescue;
 import com.google.gwt.core.client.impl.Impl;
 import com.google.gwt.core.client.impl.ArtificialRescue.Rescue;
-import com.google.gwt.core.ext.GeneratorContextExt;
+import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JArrayType;
@@ -118,7 +118,7 @@
   }
 
   @Override
-  protected void generateTypeHandlers(TreeLogger logger, GeneratorContextExt ctx,
+  protected void generateTypeHandlers(TreeLogger logger, GeneratorContext ctx,
       SerializableTypeOracle serializationSto,
       SerializableTypeOracle deserializationSto)
       throws UnableToCompleteException {
@@ -271,7 +271,7 @@
 
   @Override
   protected String writeSerializationPolicyFile(TreeLogger logger,
-      GeneratorContextExt ctx, SerializableTypeOracle serializationSto,
+      GeneratorContext ctx, SerializableTypeOracle serializationSto,
       SerializableTypeOracle deserializationSto)
       throws UnableToCompleteException {
 
diff --git a/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java b/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java
index da4e52e..4921dd4 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java
@@ -19,7 +19,7 @@
 import com.google.gwt.core.client.impl.Impl;
 import com.google.gwt.core.ext.BadPropertyValueException;
 import com.google.gwt.core.ext.ConfigurationProperty;
-import com.google.gwt.core.ext.GeneratorContextExt;
+import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.PropertyOracle;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
@@ -248,7 +248,7 @@
    *
    * @throws UnableToCompleteException
    */
-  public String create(TreeLogger logger, GeneratorContextExt context)
+  public String create(TreeLogger logger, GeneratorContext context)
       throws UnableToCompleteException {
     TypeOracle typeOracle = context.getTypeOracle();
 
@@ -690,7 +690,7 @@
   }
 
   protected void generateTypeHandlers(TreeLogger logger,
-      GeneratorContextExt context, SerializableTypeOracle typesSentFromBrowser,
+      GeneratorContext context, SerializableTypeOracle typesSentFromBrowser,
       SerializableTypeOracle typesSentToBrowser)
       throws UnableToCompleteException {
     Event event = SpeedTracerLogger.start(CompilerEventType.GENERATOR_RPC_TYPE_SERIALIZER);
@@ -729,7 +729,7 @@
   }
 
   protected String writeSerializationPolicyFile(TreeLogger logger,
-      GeneratorContextExt ctx, SerializableTypeOracle serializationSto,
+      GeneratorContext ctx, SerializableTypeOracle serializationSto,
       SerializableTypeOracle deserializationSto)
       throws UnableToCompleteException {
     try {
@@ -830,7 +830,7 @@
   }
 
   private void emitPolicyFileArtifact(TreeLogger logger,
-      GeneratorContextExt context, String partialPath)
+      GeneratorContext context, String partialPath)
       throws UnableToCompleteException {
     try {
       String qualifiedSourceName = serviceIntf.getQualifiedSourceName();
@@ -881,7 +881,7 @@
     return ResponseReader.OBJECT;
   }
 
-  private SourceWriter getSourceWriter(TreeLogger logger, GeneratorContextExt ctx,
+  private SourceWriter getSourceWriter(TreeLogger logger, GeneratorContext ctx,
       JClassType serviceAsync) {
     JPackage serviceIntfPkg = serviceAsync.getPackage();
     String packageName = serviceIntfPkg == null ? "" : serviceIntfPkg.getName();
diff --git a/user/src/com/google/gwt/user/rebind/rpc/ServiceInterfaceProxyGenerator.java b/user/src/com/google/gwt/user/rebind/rpc/ServiceInterfaceProxyGenerator.java
index 0ac93b4..ded7cda 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/ServiceInterfaceProxyGenerator.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/ServiceInterfaceProxyGenerator.java
@@ -15,25 +15,23 @@
  */
 package com.google.gwt.user.rebind.rpc;
 
-import com.google.gwt.core.ext.GeneratorContextExt;
-import com.google.gwt.core.ext.GeneratorExt;
+import com.google.gwt.core.ext.Generator;
+import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JClassType;
 import com.google.gwt.core.ext.typeinfo.TypeOracle;
-import com.google.gwt.dev.javac.rebind.RebindResult;
-import com.google.gwt.dev.javac.rebind.RebindStatus;
 
 /**
  * Generator for producing the asynchronous version of a
  * {@link com.google.gwt.user.client.rpc.RemoteService RemoteService} interface.
  */
-public class ServiceInterfaceProxyGenerator extends GeneratorExt {
+public class ServiceInterfaceProxyGenerator extends Generator {
 
   @Override
-  public RebindResult generateIncrementally(TreeLogger logger, GeneratorContextExt ctx,
+  public String generate(TreeLogger logger, GeneratorContext ctx,
       String requestedClass) throws UnableToCompleteException {
-    
+
     TypeOracle typeOracle = ctx.getTypeOracle();
     assert (typeOracle != null);
 
@@ -56,16 +54,7 @@
         "Generating client proxy for remote service interface '"
             + remoteService.getQualifiedSourceName() + "'", null);
 
-    String returnTypeName = proxyCreator.create(proxyLogger, ctx);
-    
-    /*
-     * Return with RebindStatus.USE_PARTIAL_CACHED, since we are implementing an
-     * incremental scheme, which allows us to use a mixture of previously cached
-     * and newly generated compilation units and artifacts.  For example, the
-     * field serializers only need to be generated fresh if their source type
-     * has changed (or if no previously cached version exists).
-     */
-    return new RebindResult(RebindStatus.USE_PARTIAL_CACHED, returnTypeName);
+    return proxyCreator.create(proxyLogger, ctx);
   }
 
   protected ProxyCreator createProxyCreator(JClassType remoteService) {
diff --git a/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java b/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java
index b286735..ebb31d8 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java
@@ -21,7 +21,7 @@
 import com.google.gwt.core.client.JsArrayString;
 import com.google.gwt.core.ext.BadPropertyValueException;
 import com.google.gwt.core.ext.ConfigurationProperty;
-import com.google.gwt.core.ext.GeneratorContextExt;
+import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JClassType;
@@ -29,7 +29,6 @@
 import com.google.gwt.core.ext.typeinfo.JParameterizedType;
 import com.google.gwt.core.ext.typeinfo.JType;
 import com.google.gwt.core.ext.typeinfo.TypeOracle;
-import com.google.gwt.dev.javac.rebind.CachedRebindResult;
 import com.google.gwt.dev.util.log.speedtracer.CompilerEventType;
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;
@@ -100,7 +99,7 @@
     }
   }
 
-  private final GeneratorContextExt context;
+  private final GeneratorContext context;
 
   private final SerializableTypeOracle deserializationOracle;
 
@@ -122,7 +121,7 @@
 
   public TypeSerializerCreator(TreeLogger logger,
       SerializableTypeOracle serializationOracle,
-      SerializableTypeOracle deserializationOracle, GeneratorContextExt context,
+      SerializableTypeOracle deserializationOracle, GeneratorContext context,
       String typeSerializerClassName, String typeSerializerSimpleName)
       throws UnableToCompleteException {
     this.context = context;
@@ -203,52 +202,44 @@
 
     return typeSerializerClassName;
   }
-  
+
   /*
    * Create a field serializer for a type if it does not have a custom
    * serializer.
    */
-  private void createFieldSerializer(TreeLogger logger, GeneratorContextExt ctx,
+  private void createFieldSerializer(TreeLogger logger, GeneratorContext ctx,
       JType type) {
     Event event = SpeedTracerLogger.start(CompilerEventType.GENERATOR_RPC_FIELD_SERIALIZER);
-    try {
-      assert (type != null);
-      assert (serializationOracle.isSerializable(type) || deserializationOracle.isSerializable(type));
-  
-      JParameterizedType parameterizedType = type.isParameterized();
-      if (parameterizedType != null) {
-        createFieldSerializer(logger, ctx, parameterizedType.getRawType());
-        return;
-      }
-  
-      /*
-       * Only a JClassType can reach this point in the code. JPrimitives have been
-       * removed because their serialization is built in, interfaces have been
-       * removed because they are not an instantiable type and parameterized types
-       * have been broken down into their raw types.
-       */
-      assert (type.isClass() != null || type.isArray() != null);
-      
-      if (findCacheableFieldSerializerAndMarkForReuseIfAvailable(ctx, type)) {
-        // skip generation of field serializer
-        return;
-      }
-  
-      JClassType customFieldSerializer = SerializableTypeOracleBuilder.findCustomFieldSerializer(
-          typeOracle, type);
-      FieldSerializerCreator creator = new FieldSerializerCreator(typeOracle,
-          serializationOracle, deserializationOracle, (JClassType) type,
-          customFieldSerializer);
-      creator.realize(logger, ctx);
-    } finally {
-      event.end();
+    assert (type != null);
+    assert (serializationOracle.isSerializable(type) || deserializationOracle.isSerializable(type));
+
+    JParameterizedType parameterizedType = type.isParameterized();
+    if (parameterizedType != null) {
+      createFieldSerializer(logger, ctx, parameterizedType.getRawType());
+      return;
     }
+
+    /*
+     * Only a JClassType can reach this point in the code. JPrimitives have been
+     * removed because their serialization is built in, interfaces have been
+     * removed because they are not an instantiable type and parameterized types
+     * have been broken down into their raw types.
+     */
+    assert (type.isClass() != null || type.isArray() != null);
+
+    JClassType customFieldSerializer = SerializableTypeOracleBuilder.findCustomFieldSerializer(
+        typeOracle, type);
+    FieldSerializerCreator creator = new FieldSerializerCreator(typeOracle,
+        serializationOracle, deserializationOracle, (JClassType) type,
+        customFieldSerializer);
+    creator.realize(logger, ctx);
+    event.end();
   }
 
   /*
    * Create all of the necessary field serializers.
    */
-  private void createFieldSerializers(TreeLogger logger, GeneratorContextExt ctx) {
+  private void createFieldSerializers(TreeLogger logger, GeneratorContext ctx) {
     JType[] types = getSerializableTypes();
     int typeCount = types.length;
     for (int typeIndex = 0; typeIndex < typeCount; ++typeIndex) {
@@ -258,51 +249,7 @@
       createFieldSerializer(logger, ctx, type);
     }
   }
-  
-  /*
-   * check whether we can use a previously generated version of a 
-   * FieldSerializer.  If so, mark it for reuse, and return true.
-   * Otherwise return false.
-   */
-  private boolean findCacheableFieldSerializerAndMarkForReuseIfAvailable(
-      GeneratorContextExt ctx, JType type) {
-    
-    CachedRebindResult lastResult = ctx.getCachedGeneratorResult();
-    if (lastResult == null || !ctx.isGeneratorResultCachingEnabled()) {
-      return false;
-    }
-    
-    String fieldSerializerName = 
-      SerializationUtils.getStandardSerializerName((JClassType) type);
-    
-    if (type instanceof JClassType) {
-      // check that it is available for reuse
-      if (!lastResult.isTypeCached(fieldSerializerName)) {
-        return false;
-      }
-    } else {
-      return false;
-    }
-          
-    try {
-      /*
-       * TODO(jbrosenberg): Change this check to use getVersion() from 
-       * TypeOracle, once that is available.
-       */
-      long lastModified = ctx.getSourceLastModifiedTime((JClassType) type);
-      
-      if (lastModified != 0L &&
-          lastModified < lastResult.getTimeGenerated()) {
-        
-        // use cached version  
-        return ctx.reuseTypeFromCacheIfAvailable(fieldSerializerName);
-      }
-    } catch (RuntimeException ex) {
-      // could get an exception checking modified time
-    }
-      
-    return false;
-  }
+
   private String[] getPackageAndClassName(String fullClassName) {
     String className = fullClassName;
     String packageName = "";
@@ -318,7 +265,7 @@
     return serializableTypes;
   }
 
-  private SourceWriter getSourceWriter(TreeLogger logger, GeneratorContextExt ctx) {
+  private SourceWriter getSourceWriter(TreeLogger logger, GeneratorContext ctx) {
     String name[] = getPackageAndClassName(typeSerializerClassName);
     String packageName = name[0];
     String className = name[1];