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