1579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/* 2579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Copyright (C) 2007 The Android Open Source Project 3579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 4579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * you may not use this file except in compliance with the License. 6579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * You may obtain a copy of the License at 7579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 8579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 10579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * See the License for the specific language governing permissions and 14579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * limitations under the License. 15579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 16579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 17579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpackage com.android.dx.rop.code; 18579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 19579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.cst.CstString; 20579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 21579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/** 22579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * A local variable item: either a name or a signature or both. 23579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 24579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpublic class LocalItem implements Comparable<LocalItem> { 25579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code null-ok;} local variable name */ 26579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson private final CstString name; 27579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 28579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code null-ok;} local variable signature */ 29579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson private final CstString signature; 30579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 31579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 32579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Make a new item. If both name and signature are null, null is returned. 33579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 34579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * TODO: intern these 35579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 36579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param name {@code null-ok;} local variable name 37579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param signature {@code null-ok;} local variable signature 38579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} appropriate instance. 39579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 40579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static LocalItem make(CstString name, CstString signature) { 41579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (name == null && signature == null) { 42579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return null; 43579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 44579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 45579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return new LocalItem (name, signature); 46579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 47579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 48579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 49579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Constructs instance. 50579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 51579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param name {@code null-ok;} local variable name 52579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param signature {@code null-ok;} local variable signature 53579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 54579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson private LocalItem(CstString name, CstString signature) { 55579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson this.name = name; 56579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson this.signature = signature; 57579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 58579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 59579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 60579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 61579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public boolean equals(Object other) { 62579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (!(other instanceof LocalItem)) { 63579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return false; 64579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 65579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 66579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson LocalItem local = (LocalItem) other; 67579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 68579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return 0 == compareTo(local); 69579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 70579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 71579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 72579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Compares two strings like String.compareTo(), excepts treats a null 73579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * as the least-possible string value. 74579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 75579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return negative integer, zero, or positive integer in accordance 76579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * with Comparable.compareTo() 77579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 78579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson private static int compareHandlesNulls(CstString a, CstString b) { 79579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (a == b) { 80579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return 0; 81579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } else if (a == null) { 82579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return -1; 83579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } else if (b == null) { 84579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return 1; 85579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } else { 86579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return a.compareTo(b); 87579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 88579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 89579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 90579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 91579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public int compareTo(LocalItem local) { 92579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int ret; 93579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 94579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson ret = compareHandlesNulls(name, local.name); 95579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 96579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (ret != 0) { 97579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return ret; 98579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 99579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 100579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson ret = compareHandlesNulls(signature, local.signature); 101579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 102579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return ret; 103579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 104579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 105579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 106579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 107579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 108579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public int hashCode() { 109579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return (name == null ? 0 : name.hashCode()) * 31 110579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson + (signature == null ? 0 : signature.hashCode()); 111579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 112579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 113579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 114579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 115579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public String toString() { 116579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (name != null && signature == null) { 117579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return name.toQuoted(); 118579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } else if (name == null && signature == null) { 119579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return ""; 120579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 121579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 122579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return "[" + (name == null ? "" : name.toQuoted()) 123579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson + "|" + (signature == null ? "" : signature.toQuoted()); 124579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 125579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 126579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 127579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Gets name. 128579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 129579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code null-ok;} name 130579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 131579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public CstString getName() { 132579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return name; 133579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 134579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 135579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 136579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Gets signature. 137579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 138579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code null-ok;} signature 139579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 140579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public CstString getSignature() { 141579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return signature; 142579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 143579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson} 144