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.util;
31674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
32674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.AnnotationVisitor;
33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.Attribute;
34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/**
36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * An abstract trace visitor.
37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @author Eric Bruneton
39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */
40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpublic abstract class TraceAbstractVisitor extends AbstractVisitor {
41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constant used in {@link #appendDescriptor appendDescriptor} for internal
44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * type names in bytecode notation.
45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int INTERNAL_NAME = 0;
47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constant used in {@link #appendDescriptor appendDescriptor} for field
50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * descriptors, formatted in bytecode notation
51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int FIELD_DESCRIPTOR = 1;
53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constant used in {@link #appendDescriptor appendDescriptor} for field
56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * signatures, formatted in bytecode notation
57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int FIELD_SIGNATURE = 2;
59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constant used in {@link #appendDescriptor appendDescriptor} for method
62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * descriptors, formatted in bytecode notation
63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int METHOD_DESCRIPTOR = 3;
65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
67674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constant used in {@link #appendDescriptor appendDescriptor} for method
68674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * signatures, formatted in bytecode notation
69674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
70674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int METHOD_SIGNATURE = 4;
71674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
72674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
73674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constant used in {@link #appendDescriptor appendDescriptor} for class
74674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * signatures, formatted in bytecode notation
75674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
76674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int CLASS_SIGNATURE = 5;
77674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
78674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
79674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constant used in {@link #appendDescriptor appendDescriptor} for field or
80674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * method return value signatures, formatted in default Java notation
81674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * (non-bytecode)
82674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
83674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int TYPE_DECLARATION = 6;
84674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
85674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
86674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constant used in {@link #appendDescriptor appendDescriptor} for class
87674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * signatures, formatted in default Java notation (non-bytecode)
88674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
89674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int CLASS_DECLARATION = 7;
90674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
91674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
92674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constant used in {@link #appendDescriptor appendDescriptor} for method
93674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * parameter signatures, formatted in default Java notation (non-bytecode)
94674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
95674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int PARAMETERS_DECLARATION = 8;
96674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
97674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
98674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Tab for class members.
99674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
100674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    protected String tab = "  ";
101674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
102674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
103674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Prints a disassembled view of the given annotation.
104674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
105674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param desc the class descriptor of the annotation class.
106674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param visible <tt>true</tt> if the annotation is visible at runtime.
107674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return a visitor to visit the annotation values.
108674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
109674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public AnnotationVisitor visitAnnotation(
110674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String desc,
111674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final boolean visible)
112674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
113674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
114674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(tab).append('@');
115674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendDescriptor(FIELD_DESCRIPTOR, desc);
116674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append('(');
117674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
118674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        TraceAnnotationVisitor tav = createTraceAnnotationVisitor();
119674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(tav.getText());
120674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(visible ? ")\n" : ") // invisible\n");
121674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return tav;
122674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
123674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
124674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
125674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Prints a disassembled view of the given attribute.
126674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
127674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param attr an attribute.
128674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
129674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitAttribute(final Attribute attr) {
130674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
131674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(tab).append("ATTRIBUTE ");
132674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendDescriptor(-1, attr.type);
133674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
134674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (attr instanceof Traceable) {
135674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            ((Traceable) attr).trace(buf, null);
136674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else {
137674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append(" : unknown\n");
138674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
139674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
140674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
141674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
142674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
143674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
144674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Does nothing.
145674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
146674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitEnd() {
147674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // does nothing
148674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
149674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
150674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    // ------------------------------------------------------------------------
151674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    // Utility methods
152674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    // ------------------------------------------------------------------------
153674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
154674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    protected TraceAnnotationVisitor createTraceAnnotationVisitor() {
155674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return new TraceAnnotationVisitor();
156674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
157674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
158674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
159674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Appends an internal name, a type descriptor or a type signature to
160674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * {@link #buf buf}.
161674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
162674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param type indicates if desc is an internal name, a field descriptor, a
163674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        method descriptor, a class signature, ...
164674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param desc an internal name, type descriptor, or type signature. May be
165674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        <tt>null</tt>.
166674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
167674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    protected void appendDescriptor(final int type, final String desc) {
168674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (type == CLASS_SIGNATURE || type == FIELD_SIGNATURE
169674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                || type == METHOD_SIGNATURE)
170674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        {
171674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (desc != null) {
172674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append("// signature ").append(desc).append('\n');
173674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
174674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else {
175674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append(desc);
176674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
177674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
178674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
179674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
180