Revision: 8698
Author: sco...@google.com
Date: Thu Sep  2 05:59:40 2010
Log: Fixes a strange compiler bug where types generated into new packages may not be found.

The bug happened to me when generating types into a package which didn't exist on disk, in this com.google.gwt.user.client.rpc.core.java.lang.annotation. The WebModeCompiler thought the types didn't exist. This fix makes it so that newly-generated types get packages added immediately.

http://gwt-code-reviews.appspot.com/831802/show

http://code.google.com/p/google-web-toolkit/source/detail?r=8698

Modified:
 /trunk/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java
 /trunk/dev/core/src/com/google/gwt/dev/jdt/WebModeCompilerFrontEnd.java

=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java Wed Aug 18 11:56:28 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java Thu Sep 2 05:59:40 2010
@@ -246,12 +246,15 @@
String[] typeNames = outer.doFindAdditionalTypesUsingJsni(branch, unit);
         addAdditionalTypes(branch, typeNames);

-        typeNames = outer.doFindAdditionalTypesUsingRebinds(branch, unit);
-        addAdditionalTypes(branch, typeNames);
-
typeNames = outer.doFindAdditionalTypesUsingArtificialRescues(branch,
             unit);
         addAdditionalTypes(branch, typeNames);
+
+        typeNames = outer.doFindAdditionalTypesUsingRebinds(branch, unit);
+        addAdditionalTypes(branch, typeNames);
+        if (typeNames.length > 0) {
+          refreshPackagesFromCompState();
+        }

         // Optionally remember this cud.
         //
@@ -516,10 +519,7 @@
       compiler = new CompilerImpl(env, pol, options, req, probFact);

       // Initialize the packages list.
- for (CompilationUnit unit : outer.compilationState.getCompilationUnits()) {
-        String packageName = Shared.getPackageName(unit.getTypeName());
-        rememberPackage(packageName);
-      }
+      refreshPackagesFromCompState();
     }

     public void clear() {
@@ -546,6 +546,13 @@
       }
       return unit;
     }
+
+    private void refreshPackagesFromCompState() {
+ for (CompilationUnit unit : outer.compilationState.getCompilationUnits()) {
+        String packageName = Shared.getPackageName(unit.getTypeName());
+        rememberPackage(packageName);
+      }
+    }

     /**
* Causes the compilation service itself to recognize the specified package
@@ -557,13 +564,14 @@
      * ShellJavaScriptHost.
      */
     private void rememberPackage(String packageName) {
-      int i = packageName.lastIndexOf('.');
-      if (i != -1) {
-        // Ensure the parent package is also created.
-        //
-        rememberPackage(packageName.substring(0, i));
-      }
-      knownPackages.add(packageName);
+      if (knownPackages.add(packageName)) {
+        int i = packageName.lastIndexOf('.');
+        if (i != -1) {
+          // Ensure the parent package is also created.
+          //
+          rememberPackage(packageName.substring(0, i));
+        }
+      }
     }
   }

=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/jdt/WebModeCompilerFrontEnd.java Fri Aug 6 12:01:02 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/jdt/WebModeCompilerFrontEnd.java Thu Sep 2 05:59:40 2010
@@ -33,7 +33,7 @@

 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -87,7 +87,7 @@
   @Override
   protected String[] doFindAdditionalTypesUsingRebinds(TreeLogger logger,
       CompilationUnitDeclaration cud) {
-    Set<String> dependentTypeNames = new HashSet<String>();
+    Set<String> dependentTypeNames = new LinkedHashSet<String>();

     // Find all the deferred binding request types.
FindDeferredBindingSitesVisitor v = new FindDeferredBindingSitesVisitor();

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

Reply via email to