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);
}