use of net.jangaroo.jooc.JooSymbol in project jangaroo-tools by CoreMedia.
the class JsCodeGenerator method visitCatch.
@Override
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) {
// "catch"
out.writeSymbolToken(aCatch.getSymKeyword());
// "(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(")");
}
if (!localErrorVar.getText().equals(errorVar.getText())) {
aCatch.getBlock().addBlockStartCodeGenerator(new VarCodeGenerator(localErrorVar, errorVar));
}
aCatch.getBlock().visit(this);
if (isLast) {
if (hasCondition) {
out.writeToken("else throw");
out.writeSymbolToken(errorVar);
out.writeToken(";");
}
if (!(isFirst && !hasCondition)) {
// last catch clause closes the JS catch block:
out.writeToken("}");
}
}
}
use of net.jangaroo.jooc.JooSymbol in project jangaroo-tools by CoreMedia.
the class AnnotationParameter method analyze.
public void analyze(AstNode parentNode) {
super.analyze(parentNode);
if (getValue() != null) {
getValue().analyze(this);
String metaName = parentAnnotation.getMetaName();
if ("Embed".equals(metaName) && getOptName() != null && "source".equals(getOptName().getName())) {
JooSymbol valueSymbol = getValue().getSymbol();
if (valueSymbol.sym != sym.STRING_LITERAL) {
throw new CompilerError(valueSymbol, "The source parameter of an [Embed] annotation must be a string literal");
}
String text = valueSymbol.getText();
String quote = text.substring(0, 1);
String source = (String) valueSymbol.getJooValue();
String absoluteSource = compilationUnit.addResourceDependency(source);
getValue().setValue(new JooSymbol(valueSymbol.sym, valueSymbol.getFileName(), valueSymbol.getLine(), valueSymbol.getColumn(), valueSymbol.getWhitespace(), quote + absoluteSource + quote, absoluteSource));
}
}
}
Aggregations