KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > polyglot > ext > jl > ast > ArrayAccessAssign_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>ArrayAccessAssign_c</code> represents a Java assignment expression
11  * to an array element. For instance, <code>A[3] = e</code>.
12  *
13  * The class of the <code>Expr</code> returned by
14  * <code>ArrayAccessAssign_c.left()</code>is guaranteed to be an
15  * <code>ArrayAccess</code>.
16  */

17 public class ArrayAccessAssign_c extends Assign_c implements ArrayAccessAssign
18 {
19   public ArrayAccessAssign_c(Position pos, ArrayAccess left, Operator op, Expr right) {
20     super(pos, left, op, right);
21   }
22
23   public Assign left(Expr left) {
24       ArrayAccessAssign_c n = (ArrayAccessAssign_c)super.left(left);
25       n.assertLeftType();
26       return n;
27   }
28   
29   private void assertLeftType() {
30       if (!(left() instanceof ArrayAccess)) {
31           throw new InternalCompilerError("left expression of an ArrayAccessAssign must be an array access");
32       }
33   }
34   
35   public Term entry() {
36       return left().entry();
37   }
38   
39   protected void acceptCFGAssign(CFGBuilder v) {
40       ArrayAccess a = (ArrayAccess)left();
41       
42       // a[i] = e: visit a -> i -> e -> (a[i] = e)
43
v.visitCFG(a.array(), a.index().entry());
44       v.visitCFG(a.index(), right().entry());
45       v.visitCFG(right(), this);
46   }
47   protected void acceptCFGOpAssign(CFGBuilder v) {
48       ArrayAccess a = (ArrayAccess)left();
49       
50       // a[i] OP= e: visit a -> i -> a[i] -> e -> (a[i] OP= e)
51
v.visitCFG(a.array(), a.index().entry());
52       v.visitCFG(a.index(), a);
53       v.visitThrow(a);
54       v.edge(a, right().entry());
55       v.visitCFG(right(), this);
56   }
57
58   public List throwTypes(TypeSystem ts) {
59       List l = new ArrayList(super.throwTypes(ts));
60       
61       if (throwsArrayStoreException()) {
62           l.add(ts.ArrayStoreException());
63       }
64       
65       l.add(ts.NullPointerException());
66       l.add(ts.OutOfBoundsException());
67       
68       return l;
69   }
70   
71   /** Get the throwsArrayStoreException of the expression. */
72   public boolean throwsArrayStoreException() {
73     return op == ASSIGN && left.type().isReference();
74   }
75
76 }
77
Popular Tags