001: /***
002: * ASM: a very small and fast Java bytecode manipulation framework
003: * Copyright (c) 2000-2005 INRIA, France Telecom
004: * All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: * 1. Redistributions of source code must retain the above copyright
010: * notice, this list of conditions and the following disclaimer.
011: * 2. Redistributions in binary form must reproduce the above copyright
012: * notice, this list of conditions and the following disclaimer in the
013: * documentation and/or other materials provided with the distribution.
014: * 3. Neither the name of the copyright holders nor the names of its
015: * contributors may be used to endorse or promote products derived from
016: * this software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
022: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
023: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
024: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
025: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
026: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
027: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
028: * THE POSSIBILITY OF SUCH DAMAGE.
029: */package org.drools.asm.signature;
030:
031: /**
032: * A visitor to visit a generic signature. The methods of this interface must be
033: * called in one of the three following orders (the last one is the only valid
034: * order for a {@link SignatureVisitor} that is returned by a method of this
035: * interface): <ul> <li><i>ClassSignature</i> = (
036: * <tt>visitFormalTypeParameter</tt>
037: * <tt>visitClassBound</tt>?
038: * <tt>visitInterfaceBound</tt>* )* ( <tt>visitSuperClass</tt>
039: * <tt>visitInterface</tt>* )</li>
040: * <li><i>MethodSignature</i> = ( <tt>visitFormalTypeParameter</tt>
041: * <tt>visitClassBound</tt>?
042: * <tt>visitInterfaceBound</tt>* )* ( <tt>visitParameterType</tt>*
043: * <tt>visitReturnType</tt>
044: * <tt>visitExceptionType</tt>* )</li> <li><i>TypeSignature</i> =
045: * <tt>visitBaseType</tt> | <tt>visitTypeVariable</tt> |
046: * <tt>visitArrayType</tt> | (
047: * <tt>visitClassType</tt> <tt>visitTypeArgument</tt>* (
048: * <tt>visitInnerClassType</tt> <tt>visitTypeArgument</tt>* )*
049: * <tt>visitEnd</tt> ) )</li> </ul>
050: *
051: * @author Thomas Hallgren
052: * @author Eric Bruneton
053: */
054: public interface SignatureVisitor {
055:
056: /**
057: * Wildcard for an "extends" type argument.
058: */
059: char EXTENDS = '+';
060:
061: /**
062: * Wildcard for a "super" type argument.
063: */
064: char SUPER = '-';
065:
066: /**
067: * Wildcard for a normal type argument.
068: */
069: char INSTANCEOF = '=';
070:
071: /**
072: * Visits a formal type parameter.
073: *
074: * @param name the name of the formal parameter.
075: */
076: void visitFormalTypeParameter(String name);
077:
078: /**
079: * Visits the class bound of the last visited formal type parameter.
080: *
081: * @return a non null visitor to visit the signature of the class bound.
082: */
083: SignatureVisitor visitClassBound();
084:
085: /**
086: * Visits an interface bound of the last visited formal type parameter.
087: *
088: * @return a non null visitor to visit the signature of the interface bound.
089: */
090: SignatureVisitor visitInterfaceBound();
091:
092: /**
093: * Visits the type of the super class.
094: *
095: * @return a non null visitor to visit the signature of the super class
096: * type.
097: */
098: SignatureVisitor visitSuperclass();
099:
100: /**
101: * Visits the type of an interface implemented by the class.
102: *
103: * @return a non null visitor to visit the signature of the interface type.
104: */
105: SignatureVisitor visitInterface();
106:
107: /**
108: * Visits the type of a method parameter.
109: *
110: * @return a non null visitor to visit the signature of the parameter type.
111: */
112: SignatureVisitor visitParameterType();
113:
114: /**
115: * Visits the return type of the method.
116: *
117: * @return a non null visitor to visit the signature of the return type.
118: */
119: SignatureVisitor visitReturnType();
120:
121: /**
122: * Visits the type of a method exception.
123: *
124: * @return a non null visitor to visit the signature of the exception type.
125: */
126: SignatureVisitor visitExceptionType();
127:
128: /**
129: * Visits a signature corresponding to a primitive type.
130: *
131: * @param descriptor the descriptor of the primitive type, or 'V' for
132: * <tt>void</tt>.
133: */
134: void visitBaseType(char descriptor);
135:
136: /**
137: * Visits a signature corresponding to a type variable.
138: *
139: * @param name the name of the type variable.
140: */
141: void visitTypeVariable(String name);
142:
143: /**
144: * Visits a signature corresponding to an array type.
145: *
146: * @return a non null visitor to visit the signature of the array element
147: * type.
148: */
149: SignatureVisitor visitArrayType();
150:
151: /**
152: * Starts the visit of a signature corresponding to a class or interface
153: * type.
154: *
155: * @param name the internal name of the class or interface.
156: */
157: void visitClassType(String name);
158:
159: /**
160: * Visits an inner class.
161: *
162: * @param name the local name of the inner class in its enclosing class.
163: */
164: void visitInnerClassType(String name);
165:
166: /**
167: * Visits an unbounded type argument of the last visited class or inner
168: * class type.
169: */
170: void visitTypeArgument();
171:
172: /**
173: * Visits a type argument of the last visited class or inner class type.
174: *
175: * @param wildcard '+', '-' or '='.
176: * @return a non null visitor to visit the signature of the type argument.
177: */
178: SignatureVisitor visitTypeArgument(char wildcard);
179:
180: /**
181: * Ends the visit of a signature corresponding to a class or interface type.
182: */
183: void visitEnd();
184: }
|