Java程序  |  85行  |  2.07 KB

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);
    }
}