1 package annotations.el;
2 
3 import java.util.Map;
4 
5 import annotations.util.coll.VivifyingMap;
6 
7 /**
8  * ABlock has local variables in scope.
9  * We currently directly use them only for static initializer blocks, which are
10  * not methods, but can declare local variables.
11  */
12 public class ABlock extends AExpression {
13     // Currently we don't validate the local locations (e.g., that no two
14     // distinct ranges for the same index overlap).
15     /** The method's annotated local variables; map key contains local variable location numbers */
16     public final VivifyingMap<LocalLocation, AField> locals =
17             AField.<LocalLocation>newVivifyingLHMap_AF();
18 
ABlock(Object id)19     ABlock(Object id) {
20         super(id);
21     }
22 
ABlock(ABlock block)23     ABlock(ABlock block) {
24         super(block);
25         copyMapContents(block.locals, locals);
26     }
27 
28     @Override
clone()29     public ABlock clone() {
30         return new ABlock(this);
31     }
32 
33     /**
34      * {@inheritDoc}
35      */
36     @Override
equals(AElement o)37     public boolean equals(AElement o) {
38         return o instanceof ABlock &&
39             ((ABlock) o).equalsBlock(this);
40     }
41 
equalsBlock(ABlock o)42     protected boolean equalsBlock(ABlock o) {
43         return super.equalsExpression(o)
44                 && o.locals.equals(locals);
45     }
46 
47     /**
48      * {@inheritDoc}
49      */
50     @Override
hashCode()51     public int hashCode() {
52         return super.hashCode() + locals.hashCode();
53     }
54 
55     /**
56      * {@inheritDoc}
57      */
58     @Override
prune()59     public boolean prune() {
60         return super.prune() & locals.prune();
61     }
62 
63     @Override
toString()64     public String toString() {
65         StringBuilder sb = new StringBuilder();
66         // sb.append("ABlock ");
67         // sb.append(id);
68         for (Map.Entry<LocalLocation, AField> em : locals.entrySet()) {
69             LocalLocation loc = em.getKey();
70             sb.append(loc);
71             sb.append(": ");
72             AElement ae = em.getValue();
73             sb.append(ae.toString());
74             sb.append(' ');
75         }
76         sb.append(super.toString());
77         return sb.toString();
78     }
79 
80     @Override
accept(ElementVisitor<R, T> v, T t)81     public <R, T> R accept(ElementVisitor<R, T> v, T t) {
82         return v.visitBlock(this, t);
83     }
84 }
85