• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.dexgen.rop.code;
18 
19 import com.android.dexgen.rop.cst.CstUtf8;
20 
21 /**
22  * A local variable item: either a name or a signature or both.
23  */
24 public class LocalItem implements Comparable<LocalItem> {
25     /** {@code null-ok;} local variable name */
26     private final CstUtf8 name;
27 
28     /** {@code null-ok;} local variable signature */
29     private final CstUtf8 signature;
30 
31     /**
32      * Make a new item. If both name and signature are null, null is returned.
33      *
34      * TODO: intern these
35      *
36      * @param name {@code null-ok;} local variable name
37      * @param signature {@code null-ok;} local variable signature
38      * @return {@code non-null;} appropriate instance.
39      */
make(CstUtf8 name, CstUtf8 signature)40     public static LocalItem make(CstUtf8 name, CstUtf8 signature) {
41         if (name == null && signature == null) {
42             return null;
43         }
44 
45         return new LocalItem (name, signature);
46     }
47 
48     /**
49      * Constructs instance.
50      *
51      * @param name {@code null-ok;} local variable name
52      * @param signature {@code null-ok;} local variable signature
53      */
LocalItem(CstUtf8 name, CstUtf8 signature)54     private LocalItem(CstUtf8 name, CstUtf8 signature) {
55         this.name = name;
56         this.signature = signature;
57     }
58 
59     /** {@inheritDoc} */
60     @Override
equals(Object other)61     public boolean equals(Object other) {
62         if (!(other instanceof LocalItem)) {
63             return false;
64         }
65 
66         LocalItem local = (LocalItem) other;
67 
68         return 0 == compareTo(local);
69     }
70 
71     /**
72      * Compares two strings like String.compareTo(), excepts treats a null
73      * as the least-possible string value.
74      *
75      * @return negative integer, zero, or positive integer in accordance
76      * with Comparable.compareTo()
77      */
compareHandlesNulls(CstUtf8 a, CstUtf8 b)78     private static int compareHandlesNulls(CstUtf8 a, CstUtf8 b) {
79         if (a == b) {
80             return 0;
81         } else if (a == null) {
82             return -1;
83         } else if (b == null) {
84             return 1;
85         } else {
86             return a.compareTo(b);
87         }
88     }
89 
90     /** {@inheritDoc} */
compareTo(LocalItem local)91     public int compareTo(LocalItem local) {
92         int ret;
93 
94         ret = compareHandlesNulls(name, local.name);
95 
96         if (ret != 0) {
97             return ret;
98         }
99 
100         ret = compareHandlesNulls(signature, local.signature);
101 
102         return ret;
103     }
104 
105 
106     /** {@inheritDoc} */
107     @Override
hashCode()108     public int hashCode() {
109         return (name == null ? 0 : name.hashCode()) * 31
110                 + (signature == null ? 0 : signature.hashCode());
111     }
112 
113     /** {@inheritDoc} */
114     @Override
toString()115     public String toString() {
116         if (name != null && signature == null) {
117             return name.toQuoted();
118         } else if (name == null && signature == null) {
119             return "";
120         }
121 
122         return "[" + (name == null ? "" : name.toQuoted())
123                 + "|" + (signature == null ? "" : signature.toQuoted());
124     }
125 
126     /**
127      * Gets name.
128      *
129      * @return {@code null-ok;} name
130      */
getName()131     public CstUtf8 getName() {
132         return name;
133     }
134 
135     /**
136      * Gets signature.
137      *
138      * @return {@code null-ok;} signature
139      */
getSignature()140     public CstUtf8 getSignature() {
141         return signature;
142     }
143 }
144