package annotations.el; import java.util.Map; import annotations.util.coll.VivifyingMap; /** * ABlock has local variables in scope. * We currently directly use them only for static initializer blocks, which are * not methods, but can declare local variables. */ public class ABlock extends AExpression { // Currently we don't validate the local locations (e.g., that no two // distinct ranges for the same index overlap). /** The method's annotated local variables; map key contains local variable location numbers */ public final VivifyingMap<LocalLocation, AField> locals = AField.<LocalLocation>newVivifyingLHMap_AF(); ABlock(Object id) { super(id); } ABlock(ABlock block) { super(block); copyMapContents(block.locals, locals); } @Override public ABlock clone() { return new ABlock(this); } /** * {@inheritDoc} */ @Override public boolean equals(AElement o) { return o instanceof ABlock && ((ABlock) o).equalsBlock(this); } protected boolean equalsBlock(ABlock o) { return super.equalsExpression(o) && o.locals.equals(locals); } /** * {@inheritDoc} */ @Override public int hashCode() { return super.hashCode() + locals.hashCode(); } /** * {@inheritDoc} */ @Override public boolean prune() { return super.prune() & locals.prune(); } @Override public String toString() { StringBuilder sb = new StringBuilder(); // sb.append("ABlock "); // sb.append(id); for (Map.Entry<LocalLocation, AField> em : locals.entrySet()) { LocalLocation loc = em.getKey(); sb.append(loc); sb.append(": "); AElement ae = em.getValue(); sb.append(ae.toString()); sb.append(' '); } sb.append(super.toString()); return sb.toString(); } @Override public <R, T> R accept(ElementVisitor<R, T> v, T t) { return v.visitBlock(this, t); } }