/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.dexgen.rop.cst;

/**
 * Constants of type {@code CONSTANT_*ref_info}.
 */
public abstract class CstMemberRef extends TypedConstant {
    /** {@code non-null;} the type of the defining class */
    private final CstType definingClass;

    /** {@code non-null;} the name-and-type */
    private final CstNat nat;

    /**
     * Constructs an instance.
     *
     * @param definingClass {@code non-null;} the type of the defining class
     * @param nat {@code non-null;} the name-and-type
     */
    /*package*/ CstMemberRef(CstType definingClass, CstNat nat) {
        if (definingClass == null) {
            throw new NullPointerException("definingClass == null");
        }

        if (nat == null) {
            throw new NullPointerException("nat == null");
        }

        this.definingClass = definingClass;
        this.nat = nat;
    }

    /** {@inheritDoc} */
    @Override
    public final boolean equals(Object other) {
        if ((other == null) || (getClass() != other.getClass())) {
            return false;
        }

        CstMemberRef otherRef = (CstMemberRef) other;
        return definingClass.equals(otherRef.definingClass) &&
            nat.equals(otherRef.nat);
    }

    /** {@inheritDoc} */
    @Override
    public final int hashCode() {
        return (definingClass.hashCode() * 31) ^ nat.hashCode();
    }

    /**
     * {@inheritDoc}
     *
     * <p><b>Note:</b> This implementation just compares the defining
     * class and name, and it is up to subclasses to compare the rest
     * after calling {@code super.compareTo0()}.</p>
     */
    @Override
    protected int compareTo0(Constant other) {
        CstMemberRef otherMember = (CstMemberRef) other;
        int cmp = definingClass.compareTo(otherMember.definingClass);

        if (cmp != 0) {
            return cmp;
        }

        CstUtf8 thisName = nat.getName();
        CstUtf8 otherName = otherMember.nat.getName();

        return thisName.compareTo(otherName);
    }

    /** {@inheritDoc} */
    @Override
    public final String toString() {
        return typeName() + '{' + toHuman() + '}';
    }

    /** {@inheritDoc} */
    @Override
    public final boolean isCategory2() {
        return false;
    }

    /** {@inheritDoc} */
    public final String toHuman() {
        return definingClass.toHuman() + '.' + nat.toHuman();
    }

    /**
     * Gets the type of the defining class.
     *
     * @return {@code non-null;} the type of defining class
     */
    public final CstType getDefiningClass() {
        return definingClass;
    }

    /**
     * Gets the defining name-and-type.
     *
     * @return {@code non-null;} the name-and-type
     */
    public final CstNat getNat() {
        return nat;
    }
}
