CstMemberRef.java revision 579d7739c53a2707ad711a2d2cae46d7d782f061
17ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/*
27ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Copyright (C) 2007 The Android Open Source Project
37ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman *
47ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Licensed under the Apache License, Version 2.0 (the "License");
57ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * you may not use this file except in compliance with the License.
67ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * You may obtain a copy of the License at
77ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman *
87ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman *      http://www.apache.org/licenses/LICENSE-2.0
97ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman *
107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Unless required by applicable law or agreed to in writing, software
117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * distributed under the License is distributed on an "AS IS" BASIS,
127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * See the License for the specific language governing permissions and
147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * limitations under the License.
157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman */
167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanpackage com.android.dx.rop.cst;
187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/**
207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Constants of type {@code CONSTANT_*ref_info}.
217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman */
227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanpublic abstract class CstMemberRef extends TypedConstant {
237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    /** {@code non-null;} the type of the defining class */
247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    private final CstType definingClass;
257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    /** {@code non-null;} the name-and-type */
277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    private final CstNat nat;
287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    /**
307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     * Constructs an instance.
317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     *
327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     * @param definingClass {@code non-null;} the type of the defining class
337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     * @param nat {@code non-null;} the name-and-type
347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     */
357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    /*package*/ CstMemberRef(CstType definingClass, CstNat nat) {
367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        if (definingClass == null) {
377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman            throw new NullPointerException("definingClass == null");
387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        }
397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
40b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad        if (nat == null) {
417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman            throw new NullPointerException("nat == null");
42e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer        }
43b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
44b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad        this.definingClass = definingClass;
45b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad        this.nat = nat;
46b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    }
477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    /** {@inheritDoc} */
497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    @Override
507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    public final boolean equals(Object other) {
517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        if ((other == null) || (getClass() != other.getClass())) {
527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman            return false;
537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        }
547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
55b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad        CstMemberRef otherRef = (CstMemberRef) other;
56b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad        return definingClass.equals(otherRef.definingClass) &&
57b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad            nat.equals(otherRef.nat);
587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }
5957f7dafcb769852a21870148e91535421c45d037Alexey Samsonov
609c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin    /** {@inheritDoc} */
6157f7dafcb769852a21870148e91535421c45d037Alexey Samsonov    @Override
629c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin    public final int hashCode() {
637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        return (definingClass.hashCode() * 31) ^ nat.hashCode();
647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }
657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    /**
677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     * {@inheritDoc}
687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     *
697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     * <p><b>Note:</b> This implementation just compares the defining
707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     * class and name, and it is up to subclasses to compare the rest
717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     * after calling {@code super.compareTo0()}.</p>
727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     */
737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    @Override
747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    protected int compareTo0(Constant other) {
757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        CstMemberRef otherMember = (CstMemberRef) other;
767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        int cmp = definingClass.compareTo(otherMember.definingClass);
777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        if (cmp != 0) {
797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman            return cmp;
807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        }
817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        CstString thisName = nat.getName();
837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        CstString otherName = otherMember.nat.getName();
847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        return thisName.compareTo(otherName);
867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }
877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    /** {@inheritDoc} */
897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    @Override
907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    public final String toString() {
917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        return typeName() + '{' + toHuman() + '}';
927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }
937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    /** {@inheritDoc} */
957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    @Override
967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    public final boolean isCategory2() {
977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        return false;
987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }
999c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin
1009c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin    /** {@inheritDoc} */
1019c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin    public final String toHuman() {
1029c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin        return definingClass.toHuman() + '.' + nat.toHuman();
1039c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin    }
1049c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin
10557f7dafcb769852a21870148e91535421c45d037Alexey Samsonov    /**
1069c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin     * Gets the type of the defining class.
1079c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin     *
108354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka     * @return {@code non-null;} the type of defining class
1099c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin     */
1109c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin    public final CstType getDefiningClass() {
1119c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin        return definingClass;
1129c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin    }
113955f9387516da03b51337b126bebb43567141173Benjamin Kramer
1149c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin    /**
1159c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin     * Gets the defining name-and-type.
1169c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin     *
1177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     * @return {@code non-null;} the name-and-type
1187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     */
1199c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin    public final CstNat getNat() {
1209c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin        return nat;
1217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }
12257f7dafcb769852a21870148e91535421c45d037Alexey Samsonov}
12357f7dafcb769852a21870148e91535421c45d037Alexey Samsonov