public void visitCatch(Catch aCatch) throws IOException {
List<Catch> catches = aCatch.getParentTryStatement().getCatches();
Catch firstCatch = catches.get(0);
boolean isFirst = aCatch.equals(firstCatch);
boolean isLast = aCatch.equals(catches.get(catches.size() - 1));
TypeRelation typeRelation = aCatch.getParam().getOptTypeRelation();
boolean hasCondition = aCatch.hasCondition();
if (!hasCondition && !isLast) {
throw Jooc.error(aCatch.getRParen(), "Only last catch clause may be untyped.");
}
final JooSymbol errorVar = firstCatch.getParam().getIde().getIde();
final JooSymbol localErrorVar = aCatch.getParam().getIde().getIde();
// in the following, always take care to write whitespace only once!
out.writeSymbolWhitespace(aCatch.getSymKeyword());
if (isFirst) {
out.writeSymbolToken(aCatch.getSymKeyword()); // "catch"
// "(localErrorVar)":
out.writeSymbol(aCatch.getLParen(), !hasCondition);
out.writeSymbol(errorVar, !hasCondition);
if (!hasCondition && typeRelation != null) {
// can only be ": *", add as comment:
typeRelation.visit(this);
}
out.writeSymbol(aCatch.getRParen(), !hasCondition);
if (hasCondition || !isLast) {
// a catch block always needs a brace, so generate one for conditions:
out.writeToken("{");
}
} else {
// transform catch(ide:Type){...} into else if is(e,Type)){var ide=e;...}
out.writeToken("else");
}
if (hasCondition) {
out.writeToken("if(is");
out.writeSymbol(aCatch.getLParen());
out.writeSymbolWhitespace(localErrorVar);
out.writeSymbolToken(errorVar);
out.writeSymbolWhitespace(typeRelation.getSymRelation());
out.writeToken(",");
Ide typeIde = typeRelation.getType().getIde();
out.writeSymbolWhitespace(typeIde.getIde());
out.writeToken(typeIde.getDeclaration().getQualifiedNameStr());
out.writeSymbol(aCatch.getRParen());
out.writeToken(")");
}