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