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.Prototype;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Type;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.TypeBearer;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Base class for constants of "methodish" type.
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p><b>Note:</b> As a {@link TypeBearer}, this class bears the return type
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of the method.</p>
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic abstract class CstBaseMethodRef
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        extends CstMemberRef {
3199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} the raw prototype for this method */
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final Prototype prototype;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
3599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code null-ok;} the prototype for this method taken to be an instance
3699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * method, or {@code null} if not yet calculated
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private Prototype instancePrototype;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs an instance.
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param definingClass {@code non-null;} the type of the defining class
4499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param nat {@code non-null;} the name-and-type
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*package*/ CstBaseMethodRef(CstType definingClass, CstNat nat) {
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(definingClass, nat);
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String descriptor = getNat().getDescriptor().getString();
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.prototype = Prototype.intern(descriptor);
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.instancePrototype = null;
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the raw prototype of this method. This doesn't include a
5699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code this} argument.
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the method prototype
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final Prototype getPrototype() {
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return prototype;
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the prototype of this method as either a
6699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code static} or instance method. In the case of a
6799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code static} method, this is the same as the raw
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * prototype. In the case of an instance method, this has an
6999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * appropriately-typed {@code this} argument as the first
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * one.
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param isStatic whether the method should be considered static
7399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the method prototype
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final Prototype getPrototype(boolean isStatic) {
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (isStatic) {
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return prototype;
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (instancePrototype == null) {
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Type thisType = getDefiningClass().getClassType();
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                instancePrototype = prototype.withFirstParameter(thisType);
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return instancePrototype;
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected final int compareTo0(Constant other) {
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int cmp = super.compareTo0(other);
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (cmp != 0) {
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return cmp;
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstBaseMethodRef otherMethod = (CstBaseMethodRef) other;
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return prototype.compareTo(otherMethod.prototype);
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@inheritDoc}
102de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * In this case, this method returns the <i>return type</i> of this method.
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
10599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the method's return type
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final Type getType() {
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return prototype.getReturnType();
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the number of words of parameters required by this
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method's descriptor. Since instances of this class have no way
11499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * to know if they will be used in a {@code static} or
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instance context, one has to indicate this explicitly as an
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * argument. This method is just a convenient shorthand for
11799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code getPrototype().getParameterTypes().getWordCount()},
11899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * plus {@code 1} if the method is to be treated as an
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instance method.
120de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param isStatic whether the method should be considered static
12299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code >= 0;} the argument word count
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final int getParameterWordCount(boolean isStatic) {
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return getPrototype(isStatic).getParameterTypes().getWordCount();
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets whether this is a reference to an instance initialization
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method. This is just a convenient shorthand for
13199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code getNat().isInstanceInit()}.
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
13399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code true} iff this is a reference to an
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instance initialization method
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final boolean isInstanceInit() {
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return getNat().isInstanceInit();
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets whether this is a reference to a class initialization
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method. This is just a convenient shorthand for
14399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code getNat().isClassInit()}.
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
14599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code true} iff this is a reference to an
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instance initialization method
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final boolean isClassInit() {
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return getNat().isClassInit();
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
152