Revision: 8670
Author: [email protected]
Date: Mon Aug 30 09:54:26 2010
Log: Fixes NPE when JDT doesn't generate a class file.

Instead of the old wacky algorithm where we traverse looking for types, just see what compiled classes came out and use them directly.

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

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

Modified:
 /trunk/dev/core/src/com/google/gwt/dev/javac/CompiledClass.java
 /trunk/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
 /trunk/dev/core/test/com/google/gwt/dev/javac/CompilationStateTest.java

=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/javac/CompiledClass.java Tue Nov 10 20:42:30 2009 +++ /trunk/dev/core/src/com/google/gwt/dev/javac/CompiledClass.java Mon Aug 30 09:54:26 2010
@@ -20,7 +20,6 @@

 import org.eclipse.jdt.core.compiler.CharOperation;
 import org.eclipse.jdt.internal.compiler.ClassFile;
-import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader;
 import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException;
 import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer;
@@ -34,19 +33,6 @@
 public final class CompiledClass {

   private static final DiskCache diskCache = new DiskCache();
-
-  private static ClassFile getClassFile(TypeDeclaration typeDecl,
-      String binaryName) {
- for (ClassFile tryClassFile : typeDecl.compilationResult().getClassFiles()) {
-      char[] tryBinaryName = CharOperation.concatWith(
-          tryClassFile.getCompoundName(), '/');
-      if (binaryName.equals(String.valueOf(tryBinaryName))) {
-        return tryClassFile;
-      }
-    }
-    assert false;
-    return null;
-  }

   /**
    * Returns <code>true</code> if this is a local type, or if this type is
@@ -75,11 +61,10 @@

   private transient NameEnvironmentAnswer nameEnvironmentAnswer;

- CompiledClass(TypeDeclaration typeDeclaration, CompiledClass enclosingClass) {
+  CompiledClass(ClassFile classFile, CompiledClass enclosingClass) {
     this.enclosingClass = enclosingClass;
-    SourceTypeBinding binding = typeDeclaration.binding;
+    SourceTypeBinding binding = classFile.referenceBinding;
this.internalName = CharOperation.charToString(binding.constantPoolName());
-    ClassFile classFile = getClassFile(typeDeclaration, internalName);
     byte[] bytes = classFile.getBytes();
     this.cacheToken = diskCache.writeByteArray(bytes);
     this.isLocal = isLocalType(binding);
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java Thu Aug 19 06:52:40 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java Mon Aug 30 09:54:26 2010
@@ -15,10 +15,8 @@
  */
 package com.google.gwt.dev.javac;

-import com.google.gwt.dev.jdt.SafeASTVisitor;
 import com.google.gwt.dev.jdt.TypeRefVisitor;
 import com.google.gwt.dev.util.Name.BinaryName;
-import com.google.gwt.dev.util.collect.IdentityHashMap;
 import com.google.gwt.dev.util.collect.Lists;
 import com.google.gwt.dev.util.log.speedtracer.CompilerEventType;
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
@@ -26,6 +24,7 @@
 import com.google.gwt.util.tools.Utility;

 import org.eclipse.jdt.core.compiler.CharOperation;
+import org.eclipse.jdt.internal.compiler.ClassFile;
 import org.eclipse.jdt.internal.compiler.CompilationResult;
 import org.eclipse.jdt.internal.compiler.Compiler;
 import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies;
@@ -67,6 +66,7 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -180,9 +180,13 @@
     @Override
     public void process(CompilationUnitDeclaration cud, int i) {
       super.process(cud, i);
-      FindTypesInCud typeFinder = new FindTypesInCud();
-      cud.traverse(typeFinder, cud.scope);
-      List<CompiledClass> compiledClasses = typeFinder.getClasses();
+      ClassFile[] classFiles = cud.compilationResult().getClassFiles();
+ Map<ClassFile, CompiledClass> results = new LinkedHashMap<ClassFile, CompiledClass>();
+      for (ClassFile classFile : classFiles) {
+        createCompiledClass(classFile, results);
+      }
+      List<CompiledClass> compiledClasses = new ArrayList<CompiledClass>(
+          results.values());
       addBinaryTypes(compiledClasses);

       ICompilationUnit icu = cud.compilationResult().compilationUnit;
@@ -190,39 +194,25 @@
       CompilationUnitBuilder builder = adapter.getBuilder();
       processor.process(builder, cud, compiledClasses);
     }
-  }
-
-  private class FindTypesInCud extends SafeASTVisitor {
- Map<SourceTypeBinding, CompiledClass> map = new IdentityHashMap<SourceTypeBinding, CompiledClass>();
-
-    public List<CompiledClass> getClasses() {
-      return new ArrayList<CompiledClass>(map.values());
-    }
-
-    @Override
-    public boolean visit(TypeDeclaration typeDecl, ClassScope scope) {
- CompiledClass enclosingClass = map.get(typeDecl.binding.enclosingType());
-      assert (enclosingClass != null);
-      CompiledClass newClass = new CompiledClass(typeDecl, enclosingClass);
-      map.put(typeDecl.binding, newClass);
-      return true;
-    }
-
-    @Override
- public boolean visit(TypeDeclaration typeDecl, CompilationUnitScope scope) {
-      assert (typeDecl.binding.enclosingType() == null);
-      CompiledClass newClass = new CompiledClass(typeDecl, null);
-      map.put(typeDecl.binding, newClass);
-      return true;
-    }
-
-    @Override
-    public boolean visitValid(TypeDeclaration typeDecl, BlockScope scope) {
- CompiledClass enclosingClass = map.get(typeDecl.binding.enclosingType());
-      assert (enclosingClass != null);
-      CompiledClass newClass = new CompiledClass(typeDecl, enclosingClass);
-      map.put(typeDecl.binding, newClass);
-      return true;
+
+    /**
+     * Recursively creates enclosing types first.
+     */
+    private void createCompiledClass(ClassFile classFile,
+        Map<ClassFile, CompiledClass> results) {
+      if (results.containsKey(classFile)) {
+        // Already created.
+        return;
+      }
+      CompiledClass enclosingClass = null;
+      if (classFile.enclosingClassFile != null) {
+        ClassFile enclosingClassFile = classFile.enclosingClassFile;
+        createCompiledClass(enclosingClassFile, results);
+        enclosingClass = results.get(enclosingClassFile);
+        assert enclosingClass != null;
+      }
+      CompiledClass result = new CompiledClass(classFile, enclosingClass);
+      results.put(classFile, result);
     }
   }

=======================================
--- /trunk/dev/core/test/com/google/gwt/dev/javac/CompilationStateTest.java Thu Aug 19 06:52:40 2010 +++ /trunk/dev/core/test/com/google/gwt/dev/javac/CompilationStateTest.java Mon Aug 30 09:54:26 2010
@@ -119,8 +119,7 @@
         Shared.getTypeName(JavaResourceBase.FOO)) {
       @Override
       protected CharSequence getContent() {
-        return Shared.readSource(JavaResourceBase.FOO)
-            + "\ncompilation error LOL!";
+        return "compilation error LOL!";
       }
     };
     oracle.add(badFoo);

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

Reply via email to