1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.rop.cst;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Type;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
2299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Constants of type {@code CONSTANT_NameAndType_info}.
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class CstNat extends Constant {
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code non-null;} the instance for name {@code TYPE} and descriptor
2799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code java.lang.Class}, which is useful when dealing with
28de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     * wrapped primitives
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final CstNat PRIMITIVE_TYPE_NAT =
31333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson        new CstNat(new CstString("TYPE"),
32333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson                   new CstString("Ljava/lang/Class;"));
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} the name */
35333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    private final CstString name;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} the descriptor (type) */
38333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    private final CstString descriptor;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs an instance.
42de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
4399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param name {@code non-null;} the name
4499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param descriptor {@code non-null;} the descriptor
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
46333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    public CstNat(CstString name, CstString descriptor) {
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (name == null) {
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("name == null");
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (descriptor == null) {
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("descriptor == null");
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.name = name;
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.descriptor = descriptor;
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equals(Object other) {
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!(other instanceof CstNat)) {
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstNat otherNat = (CstNat) other;
67de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro        return name.equals(otherNat.name) &&
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            descriptor.equals(otherNat.descriptor);
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int hashCode() {
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (name.hashCode() * 31) ^ descriptor.hashCode();
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected int compareTo0(Constant other) {
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstNat otherNat = (CstNat) other;
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int cmp = name.compareTo(otherNat.name);
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (cmp != 0) {
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return cmp;
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return descriptor.compareTo(otherNat.descriptor);
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "nat{" + toHuman() + '}';
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String typeName() {
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "nat";
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isCategory2() {
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the name.
110de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
11199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the name
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
113333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    public CstString getName() {
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return name;
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the descriptor.
119de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
12099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the descriptor
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
122333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    public CstString getDescriptor() {
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return descriptor;
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an unadorned but human-readable version of the name-and-type
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * value.
129de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
13099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the human form
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toHuman() {
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return name.toHuman() + ':' + descriptor.toHuman();
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the field type corresponding to this instance's descriptor.
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This method is only valid to call if the descriptor in fact describes
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * a field (and not a method).
140de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
14199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the field type
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Type getFieldType() {
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return Type.intern(descriptor.getString());
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets whether this instance has the name of a standard instance
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * initialization method. This is just a convenient shorthand for
15099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code getName().getString().equals("<init>")}.
151de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
15299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code true} iff this is a reference to an
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instance initialization method
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final boolean isInstanceInit() {
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return name.getString().equals("<init>");
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets whether this instance has the name of a standard class
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * initialization method. This is just a convenient shorthand for
16299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code getName().getString().equals("<clinit>")}.
163de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
16499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code true} iff this is a reference to an
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instance initialization method
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final boolean isClassInit() {
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return name.getString().equals("<clinit>");
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
171