KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > polyglot > ext > jl > ast > FieldAssign_c


1 package polyglot.ext.jl.ast;
2
3 import polyglot.ast.*;
4 import polyglot.types.*;
5 import polyglot.visit.*;
6 import polyglot.util.*;
7 import java.util.*;
8
9 /**
10  * A <code>FieldAssign_c</code> represents a Java assignment expression to
11  * a field. For instance, <code>this.x = e</code>.
12  *
13  * The class of the <code>Expr</code> returned by
14  * <code>FieldAssign_c.left()</code>is guaranteed to be a <code>Field</code>.
15  */

16 public class FieldAssign_c extends Assign_c implements FieldAssign
17 {
18   public FieldAssign_c(Position pos, Field left, Operator op, Expr right) {
19     super(pos, left, op, right);
20   }
21
22   public Assign left(Expr left) {
23       FieldAssign_c n = (FieldAssign_c)super.left(left);
24       n.assertLeftType();
25       return n;
26   }
27
28   private void assertLeftType() {
29       if (!(left() instanceof Field)) {
30           throw new InternalCompilerError("left expression of an FieldAssign must be a field");
31       }
32   }
33   
34   public Term entry() {
35       Field f = (Field)left();
36       if (f.target() instanceof Expr) {
37           return ((Expr) f.target()).entry();
38       }
39       else {
40           if (operator() != Assign.ASSIGN) {
41               return f;
42           }
43           else {
44               return right().entry();
45           }
46       }
47   }
48   
49   protected void acceptCFGAssign(CFGBuilder v) {
50       Field f = (Field)left();
51       if (f.target() instanceof Expr) {
52           Expr o = (Expr) f.target();
53
54               // o.f = e: visit o -> e -> (o.f = e)
55
v.visitCFG(o, right().entry());
56               v.visitCFG(right(), this);
57       }
58       else {
59               // T.f = e: visit e -> (T.f OP= e)
60
v.visitCFG(right(), this);
61       }
62       
63   }
64   protected void acceptCFGOpAssign(CFGBuilder v) {
65       Field f = (Field)left();
66       if (f.target() instanceof Expr) {
67           Expr o = (Expr) f.target();
68
69           // o.f OP= e: visit o -> o.f -> e -> (o.f OP= e)
70
v.visitCFG(o, f);
71           v.visitThrow(f);
72           v.edge(f, right().entry());
73           v.visitCFG(right(), this);
74       }
75       else {
76           // T.f OP= e: visit T.f -> e -> (T.f OP= e)
77
v.visitThrow(f);
78           v.edge(f, right().entry());
79           v.visitCFG(right(), this);
80       }
81   }
82
83   public List throwTypes(TypeSystem ts) {
84       List l = new ArrayList(super.throwTypes(ts));
85
86       Field f = (Field)left();
87       if (f.target() instanceof Expr) {
88           l.add(ts.NullPointerException());
89       }
90
91       return l;
92   }
93 }
94
Popular Tags