CstBaseMethodRef.java revision 579d7739c53a2707ad711a2d2cae46d7d782f061
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2007 The Android Open Source Project 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * you may not use this file except in compliance with the License. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See the License for the specific language governing permissions and 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * limitations under the License. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package com.android.dx.rop.cst; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import com.android.dx.rop.type.Prototype; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import com.android.dx.rop.type.Type; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import com.android.dx.rop.type.TypeBearer; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/** 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Base class for constants of "methodish" type. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <p><b>Note:</b> As a {@link TypeBearer}, this class bears the return type 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the method.</p> 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public abstract class CstBaseMethodRef 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extends CstMemberRef { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** {@code non-null;} the raw prototype for this method */ 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private final Prototype prototype; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * {@code null-ok;} the prototype for this method taken to be an instance 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * method, or {@code null} if not yet calculated 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private Prototype instancePrototype; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Constructs an instance. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param definingClass {@code non-null;} the type of the defining class 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param nat {@code non-null;} the name-and-type 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /*package*/ CstBaseMethodRef(CstType definingClass, CstNat nat) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) super(definingClass, nat); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String descriptor = getNat().getDescriptor().getString(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.prototype = Prototype.intern(descriptor); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.instancePrototype = null; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Gets the raw prototype of this method. This doesn't include a 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * {@code this} argument. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {@code non-null;} the method prototype 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public final Prototype getPrototype() { 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return prototype; 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Gets the prototype of this method as either a 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * {@code static} or instance method. In the case of a 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * {@code static} method, this is the same as the raw 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * prototype. In the case of an instance method, this has an 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * appropriately-typed {@code this} argument as the first 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * one. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param isStatic whether the method should be considered static 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {@code non-null;} the method prototype 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public final Prototype getPrototype(boolean isStatic) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (isStatic) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prototype; 78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } else { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (instancePrototype == null) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type thisType = getDefiningClass().getClassType(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instancePrototype = prototype.withFirstParameter(thisType); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instancePrototype; 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** {@inheritDoc} */ 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected final int compareTo0(Constant other) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cmp = super.compareTo0(other); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (cmp != 0) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cmp; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CstBaseMethodRef otherMethod = (CstBaseMethodRef) other; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return prototype.compareTo(otherMethod.prototype); 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * {@inheritDoc} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * In this case, this method returns the <i>return type</i> of this method. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {@code non-null;} the method's return type 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public final Type getType() { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prototype.getReturnType(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Gets the number of words of parameters required by this 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * method's descriptor. Since instances of this class have no way 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to know if they will be used in a {@code static} or 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * instance context, one has to indicate this explicitly as an 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * argument. This method is just a convenient shorthand for 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * {@code getPrototype().getParameterTypes().getWordCount()}, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * plus {@code 1} if the method is to be treated as an 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * instance method. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param isStatic whether the method should be considered static 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @return {@code >= 0;} the argument word count 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public final int getParameterWordCount(boolean isStatic) { 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return getPrototype(isStatic).getParameterTypes().getWordCount(); 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Gets whether this is a reference to an instance initialization 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * method. This is just a convenient shorthand for 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * {@code getNat().isInstanceInit()}. 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @return {@code true} iff this is a reference to an 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * instance initialization method 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public final boolean isInstanceInit() { 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return getNat().isInstanceInit(); 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Gets whether this is a reference to a class initialization 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * method. This is just a convenient shorthand for 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * {@code getNat().isClassInit()}. 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @return {@code true} iff this is a reference to an 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * instance initialization method 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public final boolean isClassInit() { 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return getNat().isClassInit(); 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci