1c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver/*
2c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * Copyright 2012, Google Inc.
3c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * All rights reserved.
4c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *
5c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * Redistribution and use in source and binary forms, with or without
6c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * modification, are permitted provided that the following conditions are
7c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * met:
8c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *
9c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *     * Redistributions of source code must retain the above copyright
10c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * notice, this list of conditions and the following disclaimer.
11c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *     * Redistributions in binary form must reproduce the above
12c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * copyright notice, this list of conditions and the following disclaimer
13c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * in the documentation and/or other materials provided with the
14c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * distribution.
15c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *     * Neither the name of Google Inc. nor the names of its
16c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * contributors may be used to endorse or promote products derived from
17c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * this software without specific prior written permission.
18c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *
19c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver */
31c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver
32c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruverpackage org.jf.dexlib2.iface;
33c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver
34a8e05220c14778d93c97911044ff5124aadbd77cBen Gruverimport org.jf.dexlib2.iface.reference.MethodReference;
35a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver
36c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruverimport javax.annotation.Nonnull;
37c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruverimport javax.annotation.Nullable;
3822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport java.util.List;
3922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport java.util.Set;
40c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver
4122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver/**
4222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * This class represents a specific method definition in a class.
4322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver *
4422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * It also acts as a MethodReference to itself. Any equality/comparison is based on its identity as a MethodReference,
4522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * and shouldn't take into account any non-MethodReference specifics of this method.
4622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver */
47a8e05220c14778d93c97911044ff5124aadbd77cBen Gruverpublic interface Method extends MethodReference {
4822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    /**
4922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * Gets the type of the class that defines this method.
5022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
5122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * @return The type of the class that defines this method
5222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     */
5322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Override @Nonnull String getDefiningClass();
5422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
5522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    /**
5622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * Gets the name of this method.
5722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
5822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * @return The name of this method
5922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     */
6022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Override @Nonnull String getName();
6122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
6222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    /**
63d4b08e1b21b144a2b300564734e272e4b85a5b56Ben Gruver     * Gets a list of the parameters of this method.
6422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
6522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * As per the MethodReference interface, the MethodParameter objects contained in the returned list also act
6622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * as a simple reference to the type of the parameter. However, the MethodParameter object can also contain
6722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * additional information about the parameter.
6822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
6922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * Note: In some implementations, the returned list is likely to *not* provide efficient random access.
7022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
7122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * @return A list of MethodParameter objects, representing the parameters of this method.
7222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     */
73d4b08e1b21b144a2b300564734e272e4b85a5b56Ben Gruver    @Nonnull List<? extends MethodParameter> getParameters();
7422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
7522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    /**
7622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * Gets the return type of this method.
7722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
7822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * @return The return type of this method.
7922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     */
8022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Override @Nonnull String getReturnType();
8122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
8222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    /**
8322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * Gets the access flags for this method.
8422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
8522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * This will be a combination of the AccessFlags.* flags that are marked as compatible for use with a method.
8622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
8722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * @return The access flags for this method
8822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     */
89c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver    int getAccessFlags();
9022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
9122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    /**
9222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * Gets a set of the annotations that are applied to this method.
9322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
9422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * The annotations in the returned set are guaranteed to have unique types.
9522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
9622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * @return A set of the annotations that are applied to this method
9722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     */
9822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nonnull Set<? extends Annotation> getAnnotations();
9922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
10022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    /**
10122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * Gets a MethodImplementation object that defines the implementation of the method.
10222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
10322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * If this is an abstract method in an abstract class, or an interface method in an interface definition, then the
10422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * method has no implementation, and this will return null.
10522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
10622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * @return A MethodImplementation object defining the implementation of this method, or null if the method has no
10722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * implementation
10822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     */
109c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver    @Nullable MethodImplementation getImplementation();
110c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver}
111