Author: [email protected]
Date: Mon May 11 17:08:36 2009
New Revision: 5340

Modified:
    trunk/dev/core/src/com/google/gwt/dev/Precompile.java
    trunk/dev/core/src/com/google/gwt/dev/jdt/RebindPermutationOracle.java
    trunk/dev/core/src/com/google/gwt/dev/jdt/WebModeCompilerFrontEnd.java
    trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
    trunk/dev/core/src/com/google/gwt/dev/jjs/impl/FragmentLoaderCreator.java
    trunk/dev/core/src/com/google/gwt/dev/shell/ShellModuleSpaceHost.java
    trunk/dev/core/src/com/google/gwt/dev/shell/StandardGeneratorContext.java
    trunk/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java
     
trunk/dev/core/test/com/google/gwt/dev/shell/StandardGeneratorContextTest.java

Log:
Big refactoring of StandardGeneratorContext so that only one instance is  
created during a compile.

Many things now share the same StandardGeneratorContext, which  
allows .finish() calls to be chunked, which is somewhat faster in some  
cases.  Also, a lot of plumbing gets cleaner because we avoid situations  
where we had to pass around all the components needed to create a new  
StandardGeneratorContext on the fly.

Review by: spoon

Modified: trunk/dev/core/src/com/google/gwt/dev/Precompile.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/Precompile.java       (original)
+++ trunk/dev/core/src/com/google/gwt/dev/Precompile.java       Mon May 11  
17:08:36 2009
@@ -35,8 +35,8 @@
  import com.google.gwt.dev.jjs.JavaToJavaScriptCompiler;
  import com.google.gwt.dev.jjs.JsOutputOption;
  import com.google.gwt.dev.jjs.UnifiedAst;
-import com.google.gwt.dev.jjs.impl.FragmentLoaderCreator;
  import com.google.gwt.dev.shell.CheckForUpdates;
+import com.google.gwt.dev.shell.StandardGeneratorContext;
  import com.google.gwt.dev.shell.StandardRebindOracle;
  import com.google.gwt.dev.shell.CheckForUpdates.UpdateResult;
  import com.google.gwt.dev.util.Memory;
@@ -255,6 +255,7 @@
    private static class DistillerRebindPermutationOracle implements
        RebindPermutationOracle {

+    private StandardGeneratorContext generatorContext;
      private Permutation[] permutations;
      private StaticPropertyOracle[] propertyOracles;
      private RebindOracle[] rebindOracles;
@@ -265,6 +266,8 @@
        permutations = new Permutation[perms.size()];
        propertyOracles = new StaticPropertyOracle[perms.size()];
        rebindOracles = new RebindOracle[perms.size()];
+      generatorContext = new StandardGeneratorContext(compilationState,  
module,
+          genDir, generatorResourcesDir, generatorArtifacts);
        BindingProperty[] orderedProps = perms.getOrderedProperties();
        SortedSet<ConfigurationProperty> configPropSet =  
module.getProperties().getConfigurationProperties();
        ConfigurationProperty[] configProps = configPropSet.toArray(new  
ConfigurationProperty[configPropSet.size()]);
@@ -273,9 +276,8 @@
          String[] orderedPropValues = perms.getOrderedPropertyValues(i);
          propertyOracles[i] = new StaticPropertyOracle(orderedProps,
              orderedPropValues, configProps);
-        rebindOracles[i] = new StandardRebindOracle(compilationState,
-            propertyOracles[i], module, rules, genDir,  
generatorResourcesDir,
-            generatorArtifacts);
+        rebindOracles[i] = new StandardRebindOracle(propertyOracles[i],  
rules,
+            generatorContext);
          permutations[i] = new Permutation(i, propertyOracles[i]);
        }
      }
@@ -298,6 +300,10 @@
        return Util.toArray(String.class, answers);
      }

+    public StandardGeneratorContext getGeneratorContext() {
+      return generatorContext;
+    }
+
      public int getPermuationCount() {
        return rebindOracles.length;
      }
@@ -420,12 +426,8 @@
            module, compilationState, generatorArtifacts,
            new PropertyPermutations(module.getProperties()), genDir,
            generatorResourcesDir);
-      FragmentLoaderCreator fragmentLoaderCreator = new  
FragmentLoaderCreator(
-          compilationState, module, genDir, generatorResourcesDir,
-          generatorArtifacts);
-      JavaToJavaScriptCompiler.precompile(logger, module, rpo,
-          fragmentLoaderCreator, declEntryPts, additionalRootTypes,  
jjsOptions,
-          true);
+      JavaToJavaScriptCompiler.precompile(logger, module, rpo,  
declEntryPts,
+          additionalRootTypes, jjsOptions, true);
        return true;
      } catch (UnableToCompleteException e) {
        // Already logged.
@@ -459,12 +461,9 @@
            generatedArtifacts,
            new PropertyPermutations(module.getProperties(), firstPerm,  
numPerms),
            genDir, generatorResourcesDir);
-      FragmentLoaderCreator fragmentLoaderCreator = new  
FragmentLoaderCreator(
-          compilationState, module, genDir, generatorResourcesDir,
-          generatedArtifacts);
        PerfLogger.start("Precompile");
        UnifiedAst unifiedAst = JavaToJavaScriptCompiler.precompile(logger,
-          module, rpo, fragmentLoaderCreator, declEntryPts, null,  
jjsOptions,
+          module, rpo, declEntryPts, null, jjsOptions,
            rpo.getPermuationCount() == 1);
        PerfLogger.end();


Modified:  
trunk/dev/core/src/com/google/gwt/dev/jdt/RebindPermutationOracle.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/jdt/RebindPermutationOracle.java      
 
(original)
+++ trunk/dev/core/src/com/google/gwt/dev/jdt/RebindPermutationOracle.java      
 
Mon May 11 17:08:36 2009
@@ -17,6 +17,7 @@

  import com.google.gwt.core.ext.TreeLogger;
  import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.dev.shell.StandardGeneratorContext;

  /**
   * Abstract the process of determining all of the possible deferred binding
@@ -29,4 +30,9 @@
     */
    String[] getAllPossibleRebindAnswers(TreeLogger logger, String  
sourceTypeName)
        throws UnableToCompleteException;
+
+  /**
+   * Returns the global StandardGeneratorContext.
+   */
+  StandardGeneratorContext getGeneratorContext();
  }

Modified:  
trunk/dev/core/src/com/google/gwt/dev/jdt/WebModeCompilerFrontEnd.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/jdt/WebModeCompilerFrontEnd.java      
 
(original)
+++ trunk/dev/core/src/com/google/gwt/dev/jdt/WebModeCompilerFrontEnd.java      
 
Mon May 11 17:08:36 2009
@@ -37,6 +37,7 @@

  import java.util.ArrayList;
  import java.util.Collections;
+import java.util.HashMap;
  import java.util.HashSet;
  import java.util.List;
  import java.util.Map;
@@ -51,12 +52,10 @@
    public static CompilationUnitDeclaration[]  
getCompilationUnitDeclarations(
        TreeLogger logger, String[] seedTypeNames,
        CompilationState compilationState,
-      RebindPermutationOracle rebindPermOracle,
-      FragmentLoaderCreator fragmentLoaderCreator)
+      RebindPermutationOracle rebindPermOracle)
        throws UnableToCompleteException {
-    return new WebModeCompilerFrontEnd(compilationState, rebindPermOracle,
-        fragmentLoaderCreator).getCompilationUnitDeclarations(logger,
-        seedTypeNames);
+    return new WebModeCompilerFrontEnd(compilationState,  
rebindPermOracle).getCompilationUnitDeclarations(
+        logger, seedTypeNames);
    }

    private final FragmentLoaderCreator fragmentLoaderCreator;
@@ -69,11 +68,11 @@
     * compiler than WebModeCompilerFrontEnd currently has.
     */
    private WebModeCompilerFrontEnd(CompilationState compilationState,
-      RebindPermutationOracle rebindPermOracle,
-      FragmentLoaderCreator fragmentLoaderCreator) {
+      RebindPermutationOracle rebindPermOracle) {
      super(compilationState, false);
      this.rebindPermOracle = rebindPermOracle;
-    this.fragmentLoaderCreator = fragmentLoaderCreator;
+    this.fragmentLoaderCreator = new FragmentLoaderCreator(
+        rebindPermOracle.getGeneratorContext());
    }

    /**
@@ -177,61 +176,18 @@
      FindDeferredBindingSitesVisitor v = new  
FindDeferredBindingSitesVisitor();
      cud.traverse(v, cud.scope);
      Map<String, MessageSendSite> requestedTypes = v.getSites();
+    Map<String, String[]> rebindAnswers = new HashMap<String, String[]>();
+    boolean doFinish = false;

      // For each, ask the host for every possible deferred binding answer.
      for (String reqType : requestedTypes.keySet()) {
        MessageSendSite site = requestedTypes.get(reqType);
-
        try {
          String[] resultTypes =  
rebindPermOracle.getAllPossibleRebindAnswers(
              logger, reqType);
-        // Check that each result is instantiable.
-        for (int i = 0; i < resultTypes.length; ++i) {
-          String typeName = resultTypes[i];
-
-          // This causes the compiler to find the additional type, possibly
-          // winding its back to ask for the compilation unit from the  
source
-          // oracle.
-          ReferenceBinding type = resolvePossiblyNestedType(typeName);
-
-          // Sanity check rebind results.
-          if (type == null) {
-            FindDeferredBindingSitesVisitor.reportRebindProblem(site,
-                "Rebind result '" + typeName + "' could not be found");
-            continue;
-          }
-          if (!type.isClass()) {
-            FindDeferredBindingSitesVisitor.reportRebindProblem(site,
-                "Rebind result '" + typeName + "' must be a class");
-            continue;
-          }
-          if (type.isAbstract()) {
-            FindDeferredBindingSitesVisitor.reportRebindProblem(site,
-                "Rebind result '" + typeName + "' cannot be abstract");
-            continue;
-          }
-          if (type.isNestedType() && !type.isStatic()) {
-            FindDeferredBindingSitesVisitor.reportRebindProblem(site,
-                "Rebind result '" + typeName
-                    + "' cannot be a non-static nested class");
-            continue;
-          }
-          if (type.isLocalType()) {
-            FindDeferredBindingSitesVisitor.reportRebindProblem(site,
-                "Rebind result '" + typeName + "' cannot be a local  
class");
-            continue;
-          }
-          // Look for a noArg ctor.
-          MethodBinding noArgCtor =  
type.getExactConstructor(TypeBinding.NO_PARAMETERS);
-          if (noArgCtor == null) {
-            FindDeferredBindingSitesVisitor.reportRebindProblem(site,
-                "Rebind result '" + typeName
-                    + "' has no default (zero argument) constructors");
-            continue;
-          }
-          dependentTypeNames.add(typeName);
-        }
+        rebindAnswers.put(reqType, resultTypes);
          Collections.addAll(dependentTypeNames, resultTypes);
+        doFinish = true;
        } catch (UnableToCompleteException e) {
          FindDeferredBindingSitesVisitor.reportRebindProblem(site,
              "Failed to resolve '" + reqType + "' via deferred binding");
@@ -247,18 +203,81 @@
       * between loaders and runAsync sites will be made in ReplaceRunAsyncs.
       */
      for (MessageSendSite site : v.getRunAsyncSites()) {
-      FragmentLoaderCreator loaderCreator = fragmentLoaderCreator;
        String resultType;
        try {
-        resultType = loaderCreator.create(logger);
+        resultType = fragmentLoaderCreator.create(logger);
          dependentTypeNames.add(resultType);
+        doFinish = true;
        } catch (UnableToCompleteException e) {
          FindDeferredBindingSitesVisitor.reportRebindProblem(site,
              "Failed to create a runAsync fragment loader");
        }
      }

+    if (doFinish) {
+      try {
+        rebindPermOracle.getGeneratorContext().finish(logger);
+      } catch (UnableToCompleteException e) {
+        throw new RuntimeException("Unable to commit generated files", e);
+      }
+    }
+
+    // Sanity check all rebind answers.
+    for (String reqType : requestedTypes.keySet()) {
+      MessageSendSite site = requestedTypes.get(reqType);
+      String[] resultTypes = rebindAnswers.get(reqType);
+      // Check that each result is instantiable.
+      for (String typeName : resultTypes) {
+        checkRebindResultInstantiable(site, typeName);
+      }
+    }
+
      return dependentTypeNames.toArray(Empty.STRINGS);
+  }
+
+  private void checkRebindResultInstantiable(MessageSendSite site,
+      String typeName) {
+    /*
+     * This causes the compiler to find the additional type, possibly  
winding
+     * its back to ask for the compilation unit from the source oracle.
+     */
+    ReferenceBinding type = resolvePossiblyNestedType(typeName);
+
+    // Sanity check rebind results.
+    if (type == null) {
+      FindDeferredBindingSitesVisitor.reportRebindProblem(site,
+          "Rebind result '" + typeName + "' could not be found");
+      return;
+    }
+    if (!type.isClass()) {
+      FindDeferredBindingSitesVisitor.reportRebindProblem(site,
+          "Rebind result '" + typeName + "' must be a class");
+      return;
+    }
+    if (type.isAbstract()) {
+      FindDeferredBindingSitesVisitor.reportRebindProblem(site,
+          "Rebind result '" + typeName + "' cannot be abstract");
+      return;
+    }
+    if (type.isNestedType() && !type.isStatic()) {
+      FindDeferredBindingSitesVisitor.reportRebindProblem(site,
+          "Rebind result '" + typeName
+              + "' cannot be a non-static nested class");
+      return;
+    }
+    if (type.isLocalType()) {
+      FindDeferredBindingSitesVisitor.reportRebindProblem(site,
+          "Rebind result '" + typeName + "' cannot be a local class");
+      return;
+    }
+    // Look for a noArg ctor.
+    MethodBinding noArgCtor =  
type.getExactConstructor(TypeBinding.NO_PARAMETERS);
+    if (noArgCtor == null) {
+      FindDeferredBindingSitesVisitor.reportRebindProblem(site,
+          "Rebind result '" + typeName
+              + "' has no default (zero argument) constructors");
+      return;
+    }
    }

    /**

Modified:  
trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java     
 
(original)
+++ trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java     
 
Mon May 11 17:08:36 2009
@@ -339,7 +339,6 @@
     * @param logger the logger to use
     * @param module the module to compile
     * @param rpo the RebindPermutationOracle
-   * @param fragmentLoaderCreator a FragmentLoaderCreator
     * @param declEntryPts the set of entry classes declared in a GWT module;
     *          these will be automatically rebound
     * @param additionalRootTypes additional classes that should serve as  
code
@@ -352,8 +351,8 @@
     *           {...@link OutOfMemoryError} occurs
     */
    public static UnifiedAst precompile(TreeLogger logger, ModuleDef module,
-      RebindPermutationOracle rpo, FragmentLoaderCreator  
fragmentLoaderCreator,
-      String[] declEntryPts, String[] additionalRootTypes, JJSOptions  
options,
+      RebindPermutationOracle rpo, String[] declEntryPts,
+      String[] additionalRootTypes, JJSOptions options,
        boolean singlePermutation) throws UnableToCompleteException {

      if (additionalRootTypes == null) {
@@ -381,7 +380,7 @@
      //
      CompilationUnitDeclaration[] goldenCuds =  
WebModeCompilerFrontEnd.getCompilationUnitDeclarations(
          logger, allRootTypes.toArray(new String[0]),
-        module.getCompilationState(logger), rpo, fragmentLoaderCreator);
+        module.getCompilationState(logger), rpo);

      // Free up memory.
      if (!options.isCompilationStateRetained()) {

Modified:  
trunk/dev/core/src/com/google/gwt/dev/jjs/impl/FragmentLoaderCreator.java
==============================================================================
---  
trunk/dev/core/src/com/google/gwt/dev/jjs/impl/FragmentLoaderCreator.java       
 
(original)
+++  
trunk/dev/core/src/com/google/gwt/dev/jjs/impl/FragmentLoaderCreator.java       
 
Mon May 11 17:08:36 2009
@@ -19,16 +19,12 @@
  import com.google.gwt.core.ext.PropertyOracle;
  import com.google.gwt.core.ext.TreeLogger;
  import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.linker.ArtifactSet;
  import com.google.gwt.dev.cfg.BindingProperty;
  import com.google.gwt.dev.cfg.ConfigurationProperty;
-import com.google.gwt.dev.cfg.PublicOracle;
  import com.google.gwt.dev.cfg.StaticPropertyOracle;
-import com.google.gwt.dev.javac.CompilationState;
  import com.google.gwt.dev.jdt.FindDeferredBindingSitesVisitor;
  import com.google.gwt.dev.shell.StandardGeneratorContext;

-import java.io.File;
  import java.io.PrintWriter;
  import java.util.List;

@@ -51,31 +47,26 @@
    private static final String UNCAUGHT_EXCEPTION_HANDLER_CLASS = GWT_CLASS
        + ".UncaughtExceptionHandler";

-  private final ArtifactSet artifactSet;
-  private final CompilationState compilationState;
-  private int entryNumber;
-  private final File genDir;
-  private final File outDir;
-  private final PublicOracle publicOracle;
+  private final StandardGeneratorContext context;
+  private int entryNumber = 0;
+  private final PropertyOracle propOracle;

    /**
     * Construct a FragmentLoaderCreator. The reason it needs so many  
parameters
     * is that it uses generator infrastructure.
     */
-  public FragmentLoaderCreator(CompilationState compilationState,
-      PublicOracle publicOracle, File genDir, File moduleOutDir,
-      ArtifactSet artifactSet) {
-    this.compilationState = compilationState;
-    this.publicOracle = publicOracle;
-    this.genDir = genDir;
-    this.outDir = moduleOutDir;
-    this.artifactSet = artifactSet;
+  public FragmentLoaderCreator(StandardGeneratorContext context) {
+    // An empty property oracle is fine, because fragment loaders aren't
+    // affected by properties anyway
+    this.propOracle = new StaticPropertyOracle(new BindingProperty[0],
+        new String[0], new ConfigurationProperty[0]);
+    this.context = context;
    }

    public String create(TreeLogger logger) throws UnableToCompleteException  
{
-    chooseEntryNumber();
-    StandardGeneratorContext context = makeGeneratorContext();
-
+    // First entry is 1.
+    ++entryNumber;
+    context.setPropertyOracle(propOracle);
      PrintWriter loaderWriter = getSourceWriterForLoader(logger, context);
      if (loaderWriter == null) {
        logger.log(TreeLogger.ERROR, "Failed to create island loader named "
@@ -97,22 +88,9 @@
      writeCallbackListClass(logger, context);
      writeLoaderSuperclass(logger, context);

-    context.finish(logger);
-
      return getLoaderQualifiedName();
    }

-  /**
-   * Pick the lowest-numbered entry number that has not yet had loaders
-   * generated.
-   */
-  private void chooseEntryNumber() {
-    entryNumber = 1;
-    while  
(compilationState.getTypeOracle().findType(getLoaderQualifiedName()) !=  
null) {
-      entryNumber++;
-    }
-  }
-
    private void generateLoaderFields(PrintWriter srcWriter) {
      srcWriter.println("// Whether the code for this entry point has  
loaded");
      srcWriter.println("private static boolean loaded = false;");
@@ -212,7 +190,8 @@
          + FindDeferredBindingSitesVisitor.MAGIC_CLASS
          + ".getUncaughtExceptionHandler();");

-    srcWriter.println("  " + getCallbackListSimpleName() + " next =  
callbacksHead;");
+    srcWriter.println("  " + getCallbackListSimpleName()
+        + " next = callbacksHead;");
      srcWriter.println("  callbacksHead = callbacksHead.next;");
      srcWriter.println("  if (callbacksHead == null) {");
      srcWriter.println("    callbacksTail = null;");
@@ -286,16 +265,6 @@
      return printWriter;
    }

-  private StandardGeneratorContext makeGeneratorContext() {
-    // An empty property oracle is fine, because fragment loaders aren't
-    // affected by properties anyway
-    PropertyOracle propOracle = new StaticPropertyOracle(
-        new BindingProperty[0], new String[0], new  
ConfigurationProperty[0]);
-    StandardGeneratorContext context = new StandardGeneratorContext(
-        compilationState, propOracle, publicOracle, genDir, outDir,  
artifactSet);
-    return context;
-  }
-
    private void writeCallbackListClass(TreeLogger logger, GeneratorContext  
ctx)
        throws UnableToCompleteException {
      PrintWriter printWriter = ctx.tryCreate(logger, getPackage(),
@@ -318,10 +287,10 @@

    /**
     * Create a stand-in superclass of the actual loader. This is used to  
keep the
-   * liveness analyzer from thinking the real <code>runCallbacks()</code>  
method
-   * is available until <code>onLoad</code> has been called and the real  
loader
-   * instantiated. A little work on TypeTightener could prevent the need  
for
-   * this class.
+   * liveness analyzer from thinking the real <code>runCallbacks()</code>
+   * method is available until <code>onLoad</code> has been called and the
+   * real loader instantiated. A little work on TypeTightener could  
prevent the
+   * need for this class.
     */
    private void writeLoaderSuperclass(TreeLogger logger, GeneratorContext  
ctx)
        throws UnableToCompleteException {

Modified:  
trunk/dev/core/src/com/google/gwt/dev/shell/ShellModuleSpaceHost.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/shell/ShellModuleSpaceHost.java       
 
(original)
+++ trunk/dev/core/src/com/google/gwt/dev/shell/ShellModuleSpaceHost.java       
 
Mon May 11 17:08:36 2009
@@ -90,8 +90,10 @@
      // It has to wait until now because we need to inject javascript.
      //
      Rules rules = module.getRules();
-    rebindOracle = new  
StandardRebindOracle(module.getCompilationState(logger),
-        propOracle, module, rules, genDir, shellDir, new ArtifactSet());
+    StandardGeneratorContext genCtx = new StandardGeneratorContext(
+        module.getCompilationState(logger), module, genDir, shellDir,
+        new ArtifactSet());
+    rebindOracle = new StandardRebindOracle(propOracle, rules, genCtx);

      // Create a completely isolated class loader which owns all classes
      // associated with a particular module. This effectively builds a

Modified:  
trunk/dev/core/src/com/google/gwt/dev/shell/StandardGeneratorContext.java
==============================================================================
---  
trunk/dev/core/src/com/google/gwt/dev/shell/StandardGeneratorContext.java       
 
(original)
+++  
trunk/dev/core/src/com/google/gwt/dev/shell/StandardGeneratorContext.java       
 
Mon May 11 17:08:36 2009
@@ -263,7 +263,7 @@

    private final Map<OutputStream, PendingResource>  
pendingResourcesByOutputStream = new IdentityHashMap<OutputStream,  
PendingResource>();

-  private final PropertyOracle propOracle;
+  private transient PropertyOracle propOracle;

    private final PublicOracle publicOracle;

@@ -274,10 +274,9 @@
     * available in the supplied type oracle although it isn't strictly  
required.
     */
    public StandardGeneratorContext(CompilationState compilationState,
-      PropertyOracle propOracle, PublicOracle publicOracle, File genDir,
-      File generatorResourcesDir, ArtifactSet allGeneratedArtifacts) {
+      PublicOracle publicOracle, File genDir, File generatorResourcesDir,
+      ArtifactSet allGeneratedArtifacts) {
      this.compilationState = compilationState;
-    this.propOracle = propOracle;
      this.publicOracle = publicOracle;
      this.genDir = genDir;
      this.generatorResourcesDir = generatorResourcesDir;
@@ -425,6 +424,14 @@
      this.currentGenerator = currentGenerator;
    }

+  /**
+   * Sets the current transient property oracle to answer current property
+   * questions.
+   */
+  public void setPropertyOracle(PropertyOracle propOracle) {
+    this.propOracle = propOracle;
+  }
+
    public final PrintWriter tryCreate(TreeLogger logger, String packageName,
        String simpleTypeName) {
      String typeName;
@@ -442,12 +449,8 @@
        return null;
      }

-    // Has anybody tried to create this type during this iteration?
+    // Type recently generated?
      if (newlyGeneratedTypeNames.contains(typeName)) {
-      final String msg = "A request to create type '"
-          + typeName
-          + "' was received while the type itself was being created; this  
might be a generator or configuration bug";
-      logger.log(TreeLogger.WARN, msg, null);
        return null;
      }


Modified:  
trunk/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java       
 
(original)
+++ trunk/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java       
 
Mon May 11 17:08:36 2009
@@ -19,14 +19,11 @@
  import com.google.gwt.core.ext.TreeLogger;
  import com.google.gwt.core.ext.UnableToCompleteException;
  import com.google.gwt.core.ext.linker.ArtifactSet;
-import com.google.gwt.dev.cfg.PublicOracle;
  import com.google.gwt.dev.cfg.Rule;
  import com.google.gwt.dev.cfg.Rules;
-import com.google.gwt.dev.javac.CompilationState;
  import com.google.gwt.dev.jdt.RebindOracle;
  import com.google.gwt.dev.util.Util;

-import java.io.File;
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.HashSet;
@@ -45,24 +42,21 @@
     */
    private final class Rebinder {

-    private final StandardGeneratorContext genCtx;
-
      private final Set<Rule> usedRules = new HashSet<Rule>();

      private final List<String> usedTypeNames = new ArrayList<String>();

-    public Rebinder() {
-      genCtx = new StandardGeneratorContext(compilationState, propOracle,
-          publicOracle, genDir, generatorResourcesDir,  
allGeneratedArtifacts);
-    }
-
      public String rebind(TreeLogger logger, String typeName,
          ArtifactAcceptor artifactAcceptor) throws  
UnableToCompleteException {

+      genCtx.setPropertyOracle(propOracle);
        String result = tryRebind(logger, typeName);
-      ArtifactSet newlyGeneratedArtifacts = genCtx.finish(logger);
-      if (!newlyGeneratedArtifacts.isEmpty() && artifactAcceptor != null) {
-        artifactAcceptor.accept(logger, newlyGeneratedArtifacts);
+      if (artifactAcceptor != null) {
+        // Go ahead and call finish() to accept new artifacts.
+        ArtifactSet newlyGeneratedArtifacts = genCtx.finish(logger);
+        if (!newlyGeneratedArtifacts.isEmpty()) {
+          artifactAcceptor.accept(logger, newlyGeneratedArtifacts);
+        }
        }
        if (result == null) {
          result = typeName;
@@ -128,32 +122,19 @@
      }
    }

-  private final ArtifactSet allGeneratedArtifacts;
-
    private final Map<String, String> cache = new HashMap<String, String>();

-  private final CompilationState compilationState;
-
-  private final File genDir;
-
-  private final File generatorResourcesDir;
+  private final StandardGeneratorContext genCtx;

    private final PropertyOracle propOracle;

-  private final PublicOracle publicOracle;
-
    private final Rules rules;

-  public StandardRebindOracle(CompilationState compilationState,
-      PropertyOracle propOracle, PublicOracle publicOracle, Rules rules,
-      File genDir, File generatorResourcesDir, ArtifactSet  
allGeneratedArtifacts) {
-    this.compilationState = compilationState;
+  public StandardRebindOracle(PropertyOracle propOracle, Rules rules,
+      StandardGeneratorContext genCtx) {
      this.propOracle = propOracle;
-    this.publicOracle = publicOracle;
      this.rules = rules;
-    this.genDir = genDir;
-    this.generatorResourcesDir = generatorResourcesDir;
-    this.allGeneratedArtifacts = allGeneratedArtifacts;
+    this.genCtx = genCtx;
    }

    public String rebind(TreeLogger logger, String typeName)

Modified:  
trunk/dev/core/test/com/google/gwt/dev/shell/StandardGeneratorContextTest.java
==============================================================================
---  
trunk/dev/core/test/com/google/gwt/dev/shell/StandardGeneratorContextTest.java  
 
(original)
+++  
trunk/dev/core/test/com/google/gwt/dev/shell/StandardGeneratorContextTest.java  
 
Mon May 11 17:08:36 2009
@@ -154,8 +154,9 @@
    public StandardGeneratorContextTest() {
      tempGenDir = createTempDir("gwt-gen-");
      tempOutDir = createTempDir("gwt-out-");
-    genCtx = new StandardGeneratorContext(mockCompilationState,  
mockPropOracle,
+    genCtx = new StandardGeneratorContext(mockCompilationState,
          mockPublicOracle, tempGenDir, tempOutDir, artifactSet);
+    genCtx.setPropertyOracle(mockPropOracle);
      genCtx.setCurrentGenerator(Generator.class);
    }


--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to