1674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/***
2674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * ASM: a very small and fast Java bytecode manipulation framework
3674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Copyright (c) 2000-2007 INRIA, France Telecom
4674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * All rights reserved.
5674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
6674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Redistribution and use in source and binary forms, with or without
7674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * modification, are permitted provided that the following conditions
8674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * are met:
9674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 1. Redistributions of source code must retain the above copyright
10674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *    notice, this list of conditions and the following disclaimer.
11674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 2. Redistributions in binary form must reproduce the above copyright
12674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *    notice, this list of conditions and the following disclaimer in the
13674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *    documentation and/or other materials provided with the distribution.
14674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 3. Neither the name of the copyright holders nor the names of its
15674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *    contributors may be used to endorse or promote products derived from
16674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *    this software without specific prior written permission.
17674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
18674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * THE POSSIBILITY OF SUCH DAMAGE.
29674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */
30674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpackage org.mockito.asm.tree;
31674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
32674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.Attribute;
33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.ClassVisitor;
34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.FieldVisitor;
35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/**
37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * A node that represents a field.
38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @author Eric Bruneton
40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */
41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpublic class FieldNode extends MemberNode implements FieldVisitor {
42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The field's access flags (see {@link org.mockito.asm.Opcodes}). This
45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * field also indicates if the field is synthetic and/or deprecated.
46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public int access;
48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The field's name.
51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public String name;
53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The field's descriptor (see {@link org.mockito.asm.Type}).
56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public String desc;
58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The field's signature. May be <tt>null</tt>.
61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public String signature;
63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The field's initial value. This field, which may be <tt>null</tt> if
66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * the field does not have an initial value, must be an {@link Integer}, a
67674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * {@link Float}, a {@link Long}, a {@link Double} or a {@link String}.
68674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
69674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public Object value;
70674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
71674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
72674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constructs a new {@link FieldNode}.
73674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
74674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param access the field's access flags (see
75674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        {@link org.mockito.asm.Opcodes}). This parameter also indicates
76674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        if the field is synthetic and/or deprecated.
77674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param name the field's name.
78674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param desc the field's descriptor (see
79674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        {@link org.mockito.asm.Type Type}).
80674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param signature the field's signature.
81674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param value the field's initial value. This parameter, which may be
82674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        <tt>null</tt> if the field does not have an initial value, must
83674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        be an {@link Integer}, a {@link Float}, a {@link Long}, a
84674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        {@link Double} or a {@link String}.
85674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
86674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public FieldNode(
87674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int access,
88674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String name,
89674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String desc,
90674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String signature,
91674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final Object value)
92674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
93674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.access = access;
94674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.name = name;
95674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.desc = desc;
96674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.signature = signature;
97674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.value = value;
98674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
99674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
100674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
101674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Makes the given class visitor visit this field.
102674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
103674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param cv a class visitor.
104674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
105674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void accept(final ClassVisitor cv) {
106674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        FieldVisitor fv = cv.visitField(access, name, desc, signature, value);
107674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (fv == null) {
108674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return;
109674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
110674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int i, n;
111674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        n = visibleAnnotations == null ? 0 : visibleAnnotations.size();
112674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (i = 0; i < n; ++i) {
113674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            AnnotationNode an = (AnnotationNode) visibleAnnotations.get(i);
114674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            an.accept(fv.visitAnnotation(an.desc, true));
115674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
116674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        n = invisibleAnnotations == null ? 0 : invisibleAnnotations.size();
117674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (i = 0; i < n; ++i) {
118674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            AnnotationNode an = (AnnotationNode) invisibleAnnotations.get(i);
119674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            an.accept(fv.visitAnnotation(an.desc, false));
120674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
121674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        n = attrs == null ? 0 : attrs.size();
122674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (i = 0; i < n; ++i) {
123674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            fv.visitAttribute((Attribute) attrs.get(i));
124674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
125674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        fv.visitEnd();
126674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
127674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
128