w.println("public void forceLoad(boolean downloadCodeOnly, Command continuation) {");
w.indentln("load(downloadCodeOnly ? -1 : 0, new Object[] {continuation});");
w.println("}");
w.println();
StringSourceWriter w_switch = new StringSourceWriter();
int methodNum = 0;
for (JMethod method : baseType_.getOverridableMethods())
{
if (!method.isAbstract())
continue;
doAssert(method.getReturnType().equals(JPrimitiveType.VOID),
"Async method had a non-void return type");
w.print("public final void ");
w.print(method.getName() + "(");
String delim = "";
for (JParameter param : method.getParameters())
{
w.print(delim);
delim = ", ";
w.print(param.getType().getQualifiedSourceName());
w.print(" " + param.getName());
}
w.print(") ");
if (method.getThrows().length > 0)
{
w.print("throws ");
String delim2 = "";
for (JType eType : method.getThrows())
{
w.print(delim2);
delim2 = ", ";
w.print(eType.getQualifiedSourceName());
}
}
w.println("{");
w.indent();
methodNum++;
if (method.getParameters().length == 0)
{
w.println("load(" + methodNum + ", null);");
}
else
{
w.println("load(" + methodNum + ", new Object[] {");
w.indent();
String delim3 = "";
for (JParameter p : method.getParameters())
{
w.print(delim3);
delim3 = ", ";
w.print(p.getName());
}
w.outdent();
w.println("});");
}
w.outdent();
w.println("}");
w.println();
w_switch.println("case " + methodNum + ":");
w_switch.indent();
w_switch.print("o." + method.getName() + "(");
String delim4 = "";
for (int i = 0; i < method.getParameters().length; i++)
{
w_switch.print(delim4);
delim4 = ", ";
w_switch.print("(");
w_switch.print(method.getParameters()[i].getType().getQualifiedSourceName());
w_switch.print(")");
w_switch.print("args[" + i + "]");
}
w_switch.println(");");
w_switch.println("break;");
w_switch.outdent();
}
w.println("private void load(final int method, final Object[] args) {");
w.indent();
w.println("GWT.runAsync(new RunAsyncCallback() {");
w.indent();
w.println("public void onFailure(Throwable reason) {");
w.indent();
w.println("try {");
w.indentln("onDelayLoadFailure(reason);");
w.println("} finally {");
w.indentln("if (method <= 0 && args[0] != null) ((Command)args[0]).execute();");
w.println("}");
w.outdent();
w.println("}");
w.println("public void onSuccess() {");
w.indent();
w.println("preInstantiationHook(new Command() {");
w.indent();
w.println("public void execute() {");
w.indent();
w.println("onSuccess2();");
w.outdent();
w.println("}");
w.outdent();
w.println("});");
w.outdent();
w.println("}");
w.println("private void onSuccess2() {");
w.indent();
w.println("try {");
w.indent();
w.println("if (method < 0) return; // download code only");
w.println("if (o == null) {");
w.indent();
w.println("o = po.get();");
w.println("onDelayLoadSuccess(o);");
w.outdent();
w.println("}");
w.println("switch (method) {");
w.println("case 0: break;");
w.println(w_switch.toString());
w.println("}");
w.outdent();
w.println("} finally {");
w.indentln("if (method <= 0 && args[0] != null) ((Command)args[0]).execute();");
w.println("}");