001package org.clafer.ast;
002
003import org.clafer.common.Check;
004
005/**
006 *
007 * @author jimmy
008 */
009public class AstDowncast implements AstSetExpr {
010
011    private final AstSetExpr base;
012    private final AstClafer target;
013
014    AstDowncast(AstSetExpr base, AstClafer target) {
015        this.base = Check.notNull(base);
016        this.target = Check.notNull(target);
017    }
018
019    public AstSetExpr getBase() {
020        return base;
021    }
022
023    public AstClafer getTarget() {
024        return target;
025    }
026
027    @Override
028    public <A, B> B accept(AstExprVisitor<A, B> visitor, A a) {
029        return visitor.visit(this, a);
030    }
031
032    @Override
033    public boolean equals(Object obj) {
034        if (obj instanceof AstDowncast) {
035            AstDowncast other = (AstDowncast) obj;
036            return base.equals(other.base) && target.equals(other.target);
037        }
038        return false;
039    }
040
041    @Override
042    public int hashCode() {
043        return 207 ^ base.hashCode() ^ target.hashCode();
044    }
045
046    @Override
047    public String toString() {
048        return "(" + target + ") " + base;
049    }
050}