Author: [email protected]
Date: Fri Mar 20 16:18:31 2009
New Revision: 5068
Modified:
changes/jat/ihm/dev/core/src/com/google/gwt/dev/HostedModeBase.java
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/BinaryCompilationUnit.java
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/BinaryCompiledClass.java
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/CompilationUnitInvalidator.java
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/JdtCompilationUnit.java
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java
changes/jat/ihm/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTest.java
Log:
Add -noBinaries option (probably will be renamed later), redid referenced
types
infrastructure, and TypeOracleMediatorTest passing.
HostedTest still fails, due to a problem with List<int[]> etc being an
acceptable
parameterized type that I didn't account for, but hosted mode is close to
fully
functional (web compile still won't work in this branch).
Modified:
changes/jat/ihm/dev/core/src/com/google/gwt/dev/HostedModeBase.java
==============================================================================
--- changes/jat/ihm/dev/core/src/com/google/gwt/dev/HostedModeBase.java
(original)
+++ changes/jat/ihm/dev/core/src/com/google/gwt/dev/HostedModeBase.java Fri
Mar 20 16:18:31 2009
@@ -61,6 +61,34 @@
abstract class HostedModeBase implements BrowserWindowController {
/**
+ * Handles the -noBinaries command line flag.
+ */
+ public static class ArgHandlerNoBinaries extends ArgHandlerFlag {
+
+ private final OptionNoBinaries option;
+
+ public ArgHandlerNoBinaries(OptionNoBinaries option) {
+ this.option = option;
+ }
+
+ @Override
+ public String getPurpose() {
+ return "Debugging: disables use of compiled class files.";
+ }
+
+ @Override
+ public String getTag() {
+ return "-noBinaries";
+ }
+
+ @Override
+ public boolean setFlag() {
+ option.setNoBinaries(true);
+ return true;
+ }
+ }
+
+ /**
* Handles the -blacklist command line argument.
*/
protected static class ArgHandlerBlacklist extends ArgHandlerString {
@@ -84,7 +112,6 @@
return BrowserWidgetHostChecker.blacklistRegexes(blacklistStr);
}
}
-
/**
* Handles the -noserver command line flag.
*/
@@ -232,7 +259,8 @@
}
protected interface HostedModeBaseOptions extends JJSOptions,
OptionLogLevel,
- OptionGenDir, OptionNoServer, OptionPort, OptionStartupURLs {
+ OptionGenDir, OptionNoServer, OptionPort, OptionStartupURLs,
+ OptionNoBinaries {
/**
* The base shell work directory.
@@ -249,6 +277,7 @@
private boolean isNoServer;
private int port;
private final List<String> startupURLs = new ArrayList<String>();
+ private boolean noBinaries;
public void addStartupURL(String url) {
startupURLs.add(url);
@@ -270,6 +299,10 @@
return isNoServer;
}
+ public void setNoBinaries(boolean noBinaries) {
+ this.noBinaries = noBinaries;
+ }
+
public void setNoServer(boolean isNoServer) {
this.isNoServer = isNoServer;
}
@@ -277,6 +310,20 @@
public void setPort(int port) {
this.port = port;
}
+
+ public boolean useBinaries() {
+ return !noBinaries;
+ }
+ }
+
+ /**
+ * Controls what port to use.
+ *
+ */
+ protected interface OptionNoBinaries {
+ void setNoBinaries(boolean noBinaries);
+
+ boolean useBinaries();
}
/**
@@ -319,6 +366,7 @@
registerHandler(new ArgHandlerLogLevel(options));
registerHandler(new ArgHandlerGenDir(options));
registerHandler(new ArgHandlerScriptStyle(options));
+ registerHandler(new ArgHandlerNoBinaries(options));
registerHandler(new ArgHandlerEnableAssertions(options));
registerHandler(new
ArgHandlerDisableAggressiveOptimization(options));
registerHandler(new ArgHandlerDisableClassMetadata(options));
@@ -538,7 +586,7 @@
boolean refresh) throws UnableToCompleteException {
refresh &= alreadySeenModules.contains(moduleName);
ModuleDef moduleDef = ModuleDefLoader.loadFromClassPath(logger,
moduleName,
- refresh, true);
+ refresh, options.useBinaries());
alreadySeenModules.add(moduleName);
assert (moduleDef != null) : "Required module state is absent";
return moduleDef;
Modified:
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/BinaryCompilationUnit.java
==============================================================================
---
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/BinaryCompilationUnit.java
(original)
+++
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/BinaryCompilationUnit.java
Fri Mar 20 16:18:31 2009
@@ -18,6 +18,7 @@
import com.google.gwt.dev.resource.Resource;
import com.google.gwt.dev.util.Name.BinaryName;
+import com.google.gwt.dev.util.Name.InternalName;
import org.eclipse.jdt.core.compiler.CategorizedProblem;
@@ -104,12 +105,12 @@
}
@Override
- protected Set<String> computeFileNameRefs() {
- Set<String> filenames = new HashSet<String>();
+ protected Set<InternalName> computeReferencedTypes() {
+ Set<InternalName> referencedTypes = new HashSet<InternalName>();
for (BinaryCompiledClass compiledClass : compiledClasses) {
- filenames.add(compiledClass.getClassResource().getLocation());
+ referencedTypes.addAll(compiledClass.getReferencedTypes());
}
- return filenames;
+ return referencedTypes;
}
@Override
@@ -118,8 +119,13 @@
}
@Override
- void setState(State newState) {
- // TODO(jat): handle setting state to FRESH
+ boolean setState(State newState) {
+ if (newState == State.FRESH) {
+ // TODO(jat): for now, ignore state changes and assume bytecode is
always
+ // fresh
+ return false;
+ }
state = newState;
+ return true;
}
}
Modified:
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/BinaryCompiledClass.java
==============================================================================
---
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/BinaryCompiledClass.java
(original)
+++
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/BinaryCompiledClass.java
Fri Mar 20 16:18:31 2009
@@ -16,6 +16,11 @@
package com.google.gwt.dev.javac;
+import com.google.gwt.dev.asm.ClassReader;
+import com.google.gwt.dev.asm.FieldVisitor;
+import com.google.gwt.dev.asm.MethodVisitor;
+import com.google.gwt.dev.asm.Type;
+import com.google.gwt.dev.asm.commons.EmptyVisitor;
import com.google.gwt.dev.js.ast.JsProgram;
import com.google.gwt.dev.resource.Resource;
import com.google.gwt.dev.util.Name;
@@ -23,13 +28,78 @@
import com.google.gwt.dev.util.Name.SourceName;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
/**
* Represents a compiled class loaded from a .class file.
*/
public class BinaryCompiledClass extends CompiledClass {
+ /**
+ * Collect all the types which are referenced by a particular class.
+ */
+ private static class CollectReferencesVisitor extends EmptyVisitor {
+ // TODO(jat): support annotation types, types in generic signatures
+
+ private static final EmptyVisitor emptyVisitor = new EmptyVisitor();
+
+ private Set<InternalName> referencedTypes = new
HashSet<InternalName>();
+
+ public Set<InternalName> getReferencedTypes() {
+ return referencedTypes;
+ }
+
+ @Override
+ public void visit(int version, int access, String name, String
signature,
+ String superName, String[] interfaces) {
+ referencedTypes.add(Name.internalName(superName));
+ if (interfaces != null) {
+ for (String intf : interfaces) {
+ referencedTypes.add(Name.internalName(intf));
+ }
+ }
+ }
+
+ @Override
+ public FieldVisitor visitField(int access, String name, String desc,
+ String signature, Object value) {
+ addTypeIfClass(Type.getType(desc));
+ return emptyVisitor;
+ }
+
+ @Override
+ public void visitInnerClass(String name, String outerName,
+ String innerName, int access) {
+ referencedTypes.add(Name.internalName(name));
+ if (outerName != null) {
+ referencedTypes.add(Name.internalName(outerName));
+ }
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc,
+ String signature, String[] exceptions) {
+ for (Type type : Type.getArgumentTypes(desc)) {
+ addTypeIfClass(type);
+ }
+ addTypeIfClass(Type.getReturnType(desc));
+ return emptyVisitor;
+ }
+
+ @Override
+ public void visitOuterClass(String owner, String name, String desc) {
+ referencedTypes.add(Name.internalName(owner));
+ }
+
+ private void addTypeIfClass(Type type) {
+ if (type.getSort() == Type.OBJECT) {
+ referencedTypes.add(Name.internalName(type.getInternalName()));
+ }
+ }
+ }
+
private InternalName name;
private List<Resource> innerClasses;
@@ -86,6 +156,13 @@
return "";
}
return name.substring(0, idx).replace('/', '.');
+ }
+
+ public Set<InternalName> getReferencedTypes() {
+ ClassReader reader = new ClassReader(getBytes());
+ CollectReferencesVisitor collector = new CollectReferencesVisitor();
+ reader.accept(collector, 0);
+ return collector.getReferencedTypes();
}
/**
Modified:
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
==============================================================================
---
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
(original)
+++
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
Fri Mar 20 16:18:31 2009
@@ -28,6 +28,7 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -99,7 +100,8 @@
private Map<InternalName,InternalName> anonymousClassMap = null;
private Set<CompiledClass> exposedCompiledClasses;
private List<JsniMethod> jsniMethods = null;
- private Set<String> fileNameRefs;
+ private Set<InternalName> cachedReferencedTypes;
+ private Set<InternalName> cachedProvidedTypes;
/*
* Check if the unit has one or more anonymous classes. 'javac' below
refers
@@ -245,7 +247,15 @@
protected abstract Set<CompiledClass> computeCompiledClasses();
- protected abstract Set<String> computeFileNameRefs();
+ protected Set<InternalName> computeProvidedTypes() {
+ Set<InternalName> providedTypes = new HashSet<InternalName>();
+ for (CompiledClass compiledClass : getCompiledClasses()) {
+ providedTypes.add(compiledClass.getInternalName());
+ }
+ return providedTypes;
+ }
+
+ protected abstract Set<InternalName> computeReferencedTypes();
/**
* Called when this unit no longer needs to keep an internal cache of its
@@ -259,7 +269,7 @@
*/
protected void invalidate() {
jsniMethods = null;
- fileNameRefs = null;
+ cachedReferencedTypes = null;
if (exposedCompiledClasses != null) {
for (CompiledClass compiledClass : exposedCompiledClasses) {
compiledClass.invalidate();
@@ -277,11 +287,18 @@
abstract CategorizedProblem[] getErrors();
- Set<String> getFileNameRefs() {
- if (fileNameRefs == null) {
- fileNameRefs = computeFileNameRefs();
+ Set<InternalName> getProvidedTypes() {
+ if (cachedProvidedTypes == null) {
+ cachedProvidedTypes = computeProvidedTypes();
+ }
+ return cachedProvidedTypes;
+ }
+
+ Set<InternalName> getReferencedTypes() {
+ if (cachedReferencedTypes == null) {
+ cachedReferencedTypes = computeReferencedTypes();
}
- return fileNameRefs;
+ return cachedReferencedTypes;
}
State getState() {
@@ -295,7 +312,7 @@
/**
* Changes the compilation unit's internal state.
*/
- abstract void setState(State newState);
+ abstract boolean setState(State newState);
private List<InternalName> getJavacClassNames(byte classBytes[]) {
AnonymousClassVisitor cv = new AnonymousClassVisitor();
Modified:
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/CompilationUnitInvalidator.java
==============================================================================
---
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/CompilationUnitInvalidator.java
(original)
+++
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/CompilationUnitInvalidator.java
Fri Mar 20 16:18:31 2009
@@ -132,30 +132,30 @@
// Assume all compiled units are valid at first.
boolean changed;
Set<CompilationUnit> validUnits = new HashSet<CompilationUnit>();
+ Set<InternalName> validRefs = new HashSet<InternalName>();
for (CompilationUnit unit : units) {
if (unit.isCompiled()) {
validUnits.add(unit);
+ validRefs.addAll(unit.getProvidedTypes());
}
}
do {
changed = false;
- Set<String> validRefs = new HashSet<String>();
- for (CompilationUnit unit : validUnits) {
- validRefs.addAll(unit.getFileNameRefs());
- }
for (Iterator<CompilationUnit> it = validUnits.iterator();
it.hasNext();) {
CompilationUnit unit = it.next();
- TreeLogger branch = null;
- for (String ref : unit.getFileNameRefs()) {
- if (!validRefs.contains(ref)) {
- if (branch == null) {
- branch = logger.branch(TreeLogger.WARN, "Compilation unit '"
- + unit + "' is removed due to invalid reference(s):");
- it.remove();
- changed = true;
- unit.setState(State.FRESH);
+ if (!validRefs.containsAll(unit.getReferencedTypes())) {
+ if (unit.setState(State.FRESH)) {
+ Set<InternalName> missing = unit.getReferencedTypes();
+ missing.removeAll(validRefs);
+ validRefs.removeAll(unit.getProvidedTypes());
+ TreeLogger branch = logger.branch(TreeLogger.WARN,
+ "Compilation unit '" + unit
+ + "' is removed due to invalid reference(s):");
+ for (InternalName type : missing) {
+ branch.log(TreeLogger.WARN, type.toString());
}
- branch.log(TreeLogger.WARN, ref);
+ it.remove();
+ changed = true;
}
}
}
@@ -165,7 +165,8 @@
public static void validateCompilationUnits(InvalidatorState state,
Set<CompilationUnit> units, Set<InternalName> validBinaryTypeNames) {
for (CompilationUnit unit : units) {
- if (unit.getState() == State.COMPILED && unit instanceof
JdtCompilationUnit) {
+ if (unit.getState() == State.COMPILED
+ && unit instanceof JdtCompilationUnit) {
CompilationUnitDeclaration jdtCud = ((JdtCompilationUnit)
unit).getJdtCud();
JSORestrictionsChecker.check(state.jsoState, jdtCud);
JsniChecker.check(jdtCud);
Modified:
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/JdtCompilationUnit.java
==============================================================================
---
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/JdtCompilationUnit.java
(original)
+++
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/JdtCompilationUnit.java
Fri Mar 20 16:18:31 2009
@@ -16,8 +16,12 @@
package com.google.gwt.dev.javac;
import com.google.gwt.dev.jdt.TypeRefVisitor;
+import com.google.gwt.dev.util.Name;
+import com.google.gwt.dev.util.Name.BinaryName;
+import com.google.gwt.dev.util.Name.InternalName;
import org.eclipse.jdt.core.compiler.CategorizedProblem;
+import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.internal.compiler.ASTVisitor;
import org.eclipse.jdt.internal.compiler.CompilationResult;
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
@@ -105,14 +109,15 @@
}
@Override
- protected Set<String> computeFileNameRefs() {
- final Set<String> result = new HashSet<String>();
+ protected Set<InternalName> computeReferencedTypes() {
+ final Set<InternalName> result = new HashSet<InternalName>();
cud.traverse(new TypeRefVisitor() {
@Override
protected void onTypeRef(SourceTypeBinding referencedType,
CompilationUnitDeclaration unitOfReferrer) {
// Map the referenced type to the target compilation unit file.
- result.add(String.valueOf(referencedType.getFileName()));
+ result.add(Name.internalName(CharOperation.charToString(
+ referencedType.constantPoolName())));
}
}, cud.scope);
return result;
@@ -153,10 +158,10 @@
* Changes the compilation unit's internal state.
*/
@Override
- void setState(State newState) {
+ boolean setState(State newState) {
assert (newState != State.COMPILED);
if (state == newState) {
- return;
+ return true;
}
state = newState;
@@ -165,7 +170,7 @@
case CHECKED:
// Must cache before we destroy the cud.
assert (cud != null);
- getFileNameRefs();
+ getReferencedTypes();
for (CompiledClass compiledClass : getCompiledClasses()) {
compiledClass.checked();
}
@@ -184,6 +189,6 @@
// to avoid compiler warnings, see assert above
break;
}
+ return true;
}
-
}
Modified:
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
==============================================================================
--- changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
(original)
+++ changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
Fri Mar 20 16:18:31 2009
@@ -286,7 +286,7 @@
long delta = System.currentTimeMillis() - startCompile;
if (logger != null) {
// Will be null in tests.
- logger.log(TreeLogger.TRACE, "Compiled " + compileUnits
+ logger.log(TreeLogger.INFO, "Compiled " + compileUnits
+ " compilation units in " + delta + "ms");
}
return true;
Modified:
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java
==============================================================================
---
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java
(original)
+++
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java
Fri Mar 20 16:18:31 2009
@@ -427,8 +427,9 @@
private final JClassType enclosingClass;
private JClassType outerClass;
- private List<JClassType[]> args = new ArrayList<JClassType[]>();
+ private List<JType[]> args = new ArrayList<JType[]>();
private int arrayDepth = 0;
+ private Throwable creationStackTrace;
/**
* Resolve a parameterized type.
@@ -445,6 +446,8 @@
JType[] returnTypeRef, TypeParameterLookup lookup,
JClassType enclosingClass,
char wildcardMatch) {
+ creationStackTrace = new Throwable();
+ creationStackTrace.fillInStackTrace();
this.logger = logger;
this.returnTypeRef = returnTypeRef;
this.lookup = lookup;
@@ -460,37 +463,43 @@
@Override
public void visitBaseType(char descriptor) {
- switch (descriptor) {
- case 'V':
- returnTypeRef[0] = JPrimitiveType.VOID;
- break;
- case 'B':
- returnTypeRef[0] = JPrimitiveType.BYTE;
- break;
- case 'J':
- returnTypeRef[0] = JPrimitiveType.LONG;
- break;
- case 'Z':
- returnTypeRef[0] = JPrimitiveType.BOOLEAN;
- break;
- case 'I':
- returnTypeRef[0] = JPrimitiveType.INT;
- break;
- case 'S':
- returnTypeRef[0] = JPrimitiveType.SHORT;
- break;
- case 'C':
- returnTypeRef[0] = JPrimitiveType.CHAR;
- break;
- case 'F':
- returnTypeRef[0] = JPrimitiveType.FLOAT;
- break;
- case 'D':
- returnTypeRef[0] = JPrimitiveType.DOUBLE;
- break;
- default:
- throw new IllegalStateException("Unrecognized base type "
- + descriptor);
+ // TODO(jat): remove try/catch and creationStackTrace
+ try {
+ switch (descriptor) {
+ case 'V':
+ returnTypeRef[0] = JPrimitiveType.VOID;
+ break;
+ case 'B':
+ returnTypeRef[0] = JPrimitiveType.BYTE;
+ break;
+ case 'J':
+ returnTypeRef[0] = JPrimitiveType.LONG;
+ break;
+ case 'Z':
+ returnTypeRef[0] = JPrimitiveType.BOOLEAN;
+ break;
+ case 'I':
+ returnTypeRef[0] = JPrimitiveType.INT;
+ break;
+ case 'S':
+ returnTypeRef[0] = JPrimitiveType.SHORT;
+ break;
+ case 'C':
+ returnTypeRef[0] = JPrimitiveType.CHAR;
+ break;
+ case 'F':
+ returnTypeRef[0] = JPrimitiveType.FLOAT;
+ break;
+ case 'D':
+ returnTypeRef[0] = JPrimitiveType.DOUBLE;
+ break;
+ default:
+ throw new IllegalStateException("Unrecognized base type "
+ + descriptor);
+ }
+ } catch (ArrayStoreException e) {
+ throw new RuntimeException(
+ "ArrayStore exception in ResolveParameterizedType",
creationStackTrace);
}
}
@@ -543,7 +552,7 @@
@Override
public SignatureVisitor visitTypeArgument(char wildcard) {
- JClassType[] arg = new JClassType[1];
+ JType[] arg = new JType[1];
args.add(arg);
// TODO(jat): !! enclosingClass?
return new ResolveParameterizedType(logger, arg, lookup, null,
wildcard);
@@ -570,7 +579,13 @@
+ expected + ", actual=" + actual;
JClassType[] typeArgs = new JClassType[actual];
for (int i = 0; i < actual; ++i) {
- typeArgs[i] = args.get(i)[0];
+ JType type = args.get(i)[0];
+ if (!(type instanceof JClassType)) {
+ logger.log(TreeLogger.ERROR, "Parameterized type argument
is "
+ + type + ", expected reference type");
+ } else {
+ typeArgs[i] = (JClassType) type;
+ }
}
try {
returnTypeRef[0] =
typeOracle.getParameterizedType(genericType, outerClass,
@@ -1760,8 +1775,7 @@
ClassReader reader = new ClassReader(classBytes);
MyClassVisitor mcv = new MyClassVisitor(classBytes);
ClassVisitor cv = mcv;
- if ("java/util/Collections$1".equals(
- compiledClass.getInternalName().toString())) {
+ if (false) {
cv = new TraceClassVisitor(cv, new PrintWriter(System.out));
}
reader.accept(cv, 0);
@@ -1881,6 +1895,12 @@
return true;
}
type.setResolved();
+ String qname = type.getQualifiedSourceName();
+ if (qname.endsWith("package-info")) {
+ // Ignore package-info classes which exist just to provide Javadoc
+ // for packages.
+ return true;
+ }
// Build a search list for type parameters to find their definition,
// resolving enclosing classes as we go up.
@@ -1909,7 +1929,7 @@
Type.getObjectType(classData.getOuterClass()));
if (outerType == null) {
logger.log(TreeLogger.ERROR, "Unable to find class "
- + outerType.getQualifiedSourceName());
+ + classData.getOuterClass());
return false;
}
// Make sure our outer class has been resolved.
@@ -1969,7 +1989,6 @@
}
}
- String qname = type.getQualifiedSourceName();
logger = logger.branch(TreeLogger.SPAM, "Found type '" + qname + "'",
null);
// Resolve annotations
Modified:
changes/jat/ihm/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTest.java
==============================================================================
---
changes/jat/ihm/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTest.java
(original)
+++
changes/jat/ihm/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTest.java
Fri Mar 20 16:18:31 2009
@@ -1011,9 +1011,10 @@
}
@Override
- void setState(State newState) {
- super.setState(newState);
+ boolean setState(State newState) {
+ boolean returnVal = super.setState(newState);
source = "This will cause a syntax error.";
+ return returnVal;
}
};
units.add(unitThatWillGoBad);
--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---