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