/*
* This file is part of the X10 project (http://x10-lang.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* This file was originally derived from the Polyglot extensible compiler framework.
*
* (C) Copyright 2000-2007 Polyglot project group, Cornell University
* (C) Copyright IBM Corporation 2007-2012.
*/
package polyglot.ast;
import polyglot.types.SemanticException;
import polyglot.types.Type;
import polyglot.util.InternalCompilerError;
import polyglot.util.Position;
import polyglot.visit.*;
/**
* 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 abstract class LocalAssign_c extends Assign_c implements LocalAssign
{
Local local;
public LocalAssign_c(NodeFactory nf, Position pos, Local left, Operator op, Expr right) {
super(nf, pos, op, right);
local = left;
}
@Override
public Assign typeCheckLeft(ContextVisitor tc) {
return this;
}
@Override
public Assign visitLeft(NodeVisitor v) {
Local local = (Local) visitChild(this.local, v);
if (local != this.local) {
LocalAssign_c n = (LocalAssign_c) copy();
n.local = local;
return n;
}
return this;
}
public Expr left() {
return local;
}
public abstract Type leftType();
public Local local() {
return local;
}
public LocalAssign local(Local local) {
LocalAssign_c n = (LocalAssign_c) copy();
n.local = local;
return n;
}
public Term firstChild() {
if (op == ASSIGN)
return right();
return local;
}
protected void acceptCFGAssign(CFGBuilder v) {
// do not visit left()
// l = e: visit e -> (l = e)
// v.visitCFG(local(), right(), ENTRY);
v.visitCFG(right(), this, EXIT);
}
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);
*/
v.visitCFG(local(), right(), ENTRY);
v.visitCFG(right(), this, EXIT);
}
public String toString() {
return local + " " + op + " " + right;
}
}