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