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