package polyglot.ext.jl.ast; import polyglot.ast.*; import polyglot.util.*; import polyglot.types.*; import polyglot.visit.*; import java.util.*; /** * A <code>Throw</code> is an immutable representation of a <code>throw</code> * statement. Such a statement contains a single <code>Expr</code> which * evaluates to the object being thrown. */ public class Throw_c extends Stmt_c implements Throw { protected Expr expr; public Throw_c(Position pos, Expr expr) { super(pos); this.expr = expr; } /** Get the expression to throw. */ public Expr expr() { return this.expr; } /** Set the expression to throw. */ public Throw expr(Expr expr) { Throw_c n = (Throw_c) copy(); n.expr = expr; return n; } /** Reconstruct the statement. */ protected Throw_c reconstruct(Expr expr) { if (expr != this.expr) { Throw_c n = (Throw_c) copy(); n.expr = expr; return n; } return this; } /** Visit the children of the statement. */ public Node visitChildren(NodeVisitor v) { Expr expr = (Expr) visitChild(this.expr, v); return reconstruct(expr); } /** Type check the statement. */ public Node typeCheck(TypeChecker tc) throws SemanticException { if (! expr.type().isThrowable()) { throw new SemanticException( "Can only throw subclasses of \"" + tc.typeSystem().Throwable() + "\".", expr.position()); } return this; } public Type childExpectedType(Expr child, AscriptionVisitor av) { TypeSystem ts = av.typeSystem(); if (child == expr) { return ts.Throwable(); } return child.type(); } public String toString() { return "throw " + expr + ";"; } /** Write the statement to an output file. */ public void prettyPrint(CodeWriter w, PrettyPrinter tr) { w.write("throw "); print(expr, w, tr); w.write(";"); } public Term entry() { return expr.entry(); } public List acceptCFG(CFGBuilder v, List succs) { v.visitCFG(expr, this); // Throw edges will be handled by visitor. return Collections.EMPTY_LIST; } public List throwTypes(TypeSystem ts) { // if the exception that a throw statement is given to throw is null, // then a NullPointerException will be thrown. return CollectionUtil.list(expr.type(), ts.NullPointerException()); } }