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