package polyglot.ext.jl.ast;
import polyglot.ast.*;
import polyglot.types.*;
import polyglot.visit.*;
import polyglot.util.*;
import java.util.*;
/**
* A <code>LocalAssign_c</code> represents a Java assignment expression
* to a local variable. For instance, <code>x = e</code>.
*
* The class of the <code>Expr</code> returned by
* <code>LocalAssign_c.left()</code>is guaranteed to be an <code>Local</code>.
*/
public class LocalAssign_c extends Assign_c implements LocalAssign
{
public LocalAssign_c(Position pos, Local left, Operator op, Expr right) {
super(pos, left, op, right);
}
public Assign left(Expr left) {
LocalAssign_c n = (LocalAssign_c)super.left(left);
n.assertLeftType();
return n;
}
private void assertLeftType() {
if (!(left() instanceof Local)) {
throw new InternalCompilerError("left expression of an LocalAssign must be a local");
}
}
public Term entry() {
if (operator() != Assign.ASSIGN) {
return left();
}
return right().entry();
}
protected void acceptCFGAssign(CFGBuilder v) {
Local l = (Local)left();
// x OP= e: visit e -> (l OP= e)
v.visitCFG(right(), this);
}
protected void acceptCFGOpAssign(CFGBuilder v) {
Local l = (Local)left();
// l OP= e: visit l -> e -> (l OP= e)
v.visitThrow(l);
v.edge(l, right().entry());
v.visitCFG(right(), this);
}
}