Slick trick with CompiledClass source location allows a much looser coupling of compilation unit validation code.

Review by: bobv

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6697 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/javac/BinaryTypeReferenceRestrictionsChecker.java b/dev/core/src/com/google/gwt/dev/javac/BinaryTypeReferenceRestrictionsChecker.java
index 5f8e178..065707f 100644
--- a/dev/core/src/com/google/gwt/dev/javac/BinaryTypeReferenceRestrictionsChecker.java
+++ b/dev/core/src/com/google/gwt/dev/javac/BinaryTypeReferenceRestrictionsChecker.java
@@ -110,8 +110,7 @@
    * is reported against the {@link CompilationUnitDeclaration} for the first
    * instance of each unique {@link BinaryTypeBinding}.
    */
-  public static void check(CompilationUnitDeclaration cud,
-      Set<String> validBinaryTypeNames) {
+  public static void check(CompilationUnitDeclaration cud) {
     List<BinaryTypeReferenceSite> binaryTypeReferenceSites = findAllBinaryTypeReferenceSites(cud);
     Set<BinaryTypeBinding> alreadySeenTypeBindings = new HashSet<BinaryTypeBinding>();
 
@@ -122,8 +121,8 @@
       }
       alreadySeenTypeBindings.add(binaryTypeBinding);
 
-      String binaryName = String.valueOf(binaryTypeBinding.constantPoolName());
-      if (validBinaryTypeNames.contains(binaryName)) {
+      String fileName = String.valueOf(binaryTypeBinding.getFileName());
+      if (fileName.endsWith(".java")) {
         // This binary name is valid; it is a reference to a unit that was
         // compiled in a previous JDT run.
         continue;
diff --git a/dev/core/src/com/google/gwt/dev/javac/CompilationState.java b/dev/core/src/com/google/gwt/dev/javac/CompilationState.java
index bb34b9d..72ec638 100644
--- a/dev/core/src/com/google/gwt/dev/javac/CompilationState.java
+++ b/dev/core/src/com/google/gwt/dev/javac/CompilationState.java
@@ -345,7 +345,7 @@
 
       // Check all units using our custom checks.
       CompilationUnitInvalidator.validateCompilationUnits(invalidatorState,
-          newUnits, jdtCompiler.getBinaryTypeNames());
+          newUnits);
 
       // More units may have errors now.
       anyErrors |= CompilationUnitInvalidator.invalidateUnitsWithErrors(logger,
diff --git a/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java b/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
index 25e1e0e..62576fc 100644
--- a/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
+++ b/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
@@ -285,16 +285,14 @@
     return GENERATED_CLASSNAME_PATTERN.matcher(className).matches();
   }
 
-  private static Set<String> computeFileNameRefs(
-      CompilationUnitDeclaration cud,
-      final Map<String, String> binaryTypeToSourceFileMap) {
+  private static Set<String> computeFileNameRefs(CompilationUnitDeclaration cud) {
     final Set<String> result = new HashSet<String>();
     cud.traverse(new TypeRefVisitor(cud) {
       @Override
       protected void onBinaryTypeRef(BinaryTypeBinding referencedType,
           CompilationUnitDeclaration unitOfReferrer, Expression expression) {
-        String fileName = binaryTypeToSourceFileMap.get(String.valueOf(referencedType.getFileName()));
-        if (fileName != null) {
+        String fileName = String.valueOf(referencedType.getFileName());
+        if (fileName.endsWith(".java")) {
           result.add(fileName);
         }
       }
@@ -507,11 +505,10 @@
   /**
    * Sets the compiled JDT AST for this unit.
    */
-  void setCompiled(CompilationUnitDeclaration cud,
-      Map<String, String> binaryTypeToSourceFileMap) {
+  void setCompiled(CompilationUnitDeclaration cud) {
     assert (state == State.FRESH || state == State.ERROR);
     this.cud = cud;
-    fileNameRefs = computeFileNameRefs(cud, binaryTypeToSourceFileMap);
+    fileNameRefs = computeFileNameRefs(cud);
     state = State.COMPILED;
   }
 
diff --git a/dev/core/src/com/google/gwt/dev/javac/CompilationUnitInvalidator.java b/dev/core/src/com/google/gwt/dev/javac/CompilationUnitInvalidator.java
index 4824f6b..c3f586e 100644
--- a/dev/core/src/com/google/gwt/dev/javac/CompilationUnitInvalidator.java
+++ b/dev/core/src/com/google/gwt/dev/javac/CompilationUnitInvalidator.java
@@ -196,15 +196,14 @@
   }
 
   public static void validateCompilationUnits(InvalidatorState state,
-      Collection<CompilationUnit> units, Set<String> validBinaryTypeNames) {
+      Collection<CompilationUnit> units) {
     for (CompilationUnit unit : units) {
       if (unit.getState() == State.COMPILED) {
         CompilationUnitDeclaration jdtCud = unit.getJdtCud();
         JSORestrictionsChecker.check(state.jsoState, jdtCud);
         JsniChecker.check(jdtCud);
         ArtificialRescueChecker.check(unit);
-        BinaryTypeReferenceRestrictionsChecker.check(jdtCud,
-            validBinaryTypeNames);
+        BinaryTypeReferenceRestrictionsChecker.check(jdtCud);
       }
     }
     state.jsoState.finalCheck();
diff --git a/dev/core/src/com/google/gwt/dev/javac/CompiledClass.java b/dev/core/src/com/google/gwt/dev/javac/CompiledClass.java
index e24b458..d356681 100644
--- a/dev/core/src/com/google/gwt/dev/javac/CompiledClass.java
+++ b/dev/core/src/com/google/gwt/dev/javac/CompiledClass.java
@@ -68,7 +68,6 @@
   protected final CompiledClass enclosingClass;
   protected final String internalName;
   protected final boolean isLocal;
-  protected final String location;
   protected final CompilationUnit unit;
 
   /**
@@ -92,7 +91,6 @@
     ClassFile classFile = getClassFile(typeDeclaration, internalName);
     byte[] bytes = classFile.getBytes();
     this.cacheToken = diskCache.writeByteArray(bytes);
-    this.location = String.valueOf(classFile.fileName());
     this.isLocal = isLocalType(binding);
   }
 
@@ -156,7 +154,7 @@
     if (nameEnvironmentAnswer == null) {
       try {
         ClassFileReader cfr = new ClassFileReader(getBytes(),
-            location.toCharArray());
+            unit.getDisplayLocation().toCharArray(), true);
         nameEnvironmentAnswer = new NameEnvironmentAnswer(cfr, null);
       } catch (ClassFormatException e) {
         throw new RuntimeException("Unexpectedly unable to parse class file", e);
diff --git a/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java b/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
index 818d4c6..93059b7 100644
--- a/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
@@ -103,7 +103,7 @@
       ICompilationUnit icu = cud.compilationResult().compilationUnit;
       CompilationUnitAdapter adapter = (CompilationUnitAdapter) icu;
       CompilationUnit unit = adapter.getUnit();
-      unit.setCompiled(cud, binaryTypesRefs);
+      unit.setCompiled(cud);
       if (!cud.compilationResult().hasErrors()) {
         recordBinaryTypes(unit.getCompiledClasses());
       }
@@ -217,11 +217,6 @@
    */
   private final Map<String, CompiledClass> binaryTypes = new HashMap<String, CompiledClass>();
 
-  /**
-   * Maps dotted binary names the containing unit location.
-   */
-  private final Map<String, String> binaryTypesRefs = new HashMap<String, String>();
-
   private final Set<String> notPackages = new HashSet<String>();
 
   private final Set<String> packages = new HashSet<String>();
@@ -255,10 +250,6 @@
     return true;
   }
 
-  public Set<String> getBinaryTypeNames() {
-    return binaryTypes.keySet();
-  }
-
   private void addPackages(String slashedPackageName) {
     while (packages.add(slashedPackageName)) {
       int pos = slashedPackageName.lastIndexOf('/');
@@ -274,8 +265,6 @@
   private void recordBinaryTypes(Set<CompiledClass> compiledClasses) {
     for (CompiledClass compiledClass : compiledClasses) {
       binaryTypes.put(compiledClass.getInternalName(), compiledClass);
-      binaryTypesRefs.put(compiledClass.getInternalName(),
-          compiledClass.getUnit().getDisplayLocation());
     }
   }
 
diff --git a/dev/core/test/com/google/gwt/dev/javac/TypeOracleTestingUtils.java b/dev/core/test/com/google/gwt/dev/javac/TypeOracleTestingUtils.java
index f201f73..8191e11 100644
--- a/dev/core/test/com/google/gwt/dev/javac/TypeOracleTestingUtils.java
+++ b/dev/core/test/com/google/gwt/dev/javac/TypeOracleTestingUtils.java
@@ -61,8 +61,7 @@
     }
     JdtCompiler.compile(units);
     CompilationUnitInvalidator.InvalidatorState state = new CompilationUnitInvalidator.InvalidatorState();
-    CompilationUnitInvalidator.validateCompilationUnits(state, units,
-        validBinaryTypeNames);
+    CompilationUnitInvalidator.validateCompilationUnits(state, units);
     if (CompilationUnitInvalidator.invalidateUnitsWithErrors(logger, units)) {
       CompilationUnitInvalidator.invalidateUnitsWithInvalidRefs(logger, units);
     }