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