001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *   https://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied.  See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019package org.apache.bcel.classfile;
020
021/**
022 * Interface to make use of the Visitor pattern programming style. I.e. a class that implements this interface can
023 * traverse the contents of a Java class just by calling the 'accept' method which all classes have.
024 */
025public interface Visitor {
026
027    /**
028     * Visits an Annotations attribute.
029     *
030     * @param obj the attribute.
031     * @since 6.0
032     */
033    void visitAnnotation(Annotations obj);
034
035    /**
036     * Visits an AnnotationDefault attribute.
037     *
038     * @param obj the attribute.
039     * @since 6.0
040     */
041    void visitAnnotationDefault(AnnotationDefault obj);
042
043    /**
044     * Visits an AnnotationEntry.
045     *
046     * @param obj the annotation entry.
047     * @since 6.0
048     */
049    void visitAnnotationEntry(AnnotationEntry obj);
050
051    /**
052     * Visits a BootstrapMethods attribute.
053     *
054     * @param obj the attribute.
055     * @since 6.0
056     */
057    void visitBootstrapMethods(BootstrapMethods obj);
058
059    /**
060     * Visits a Code attribute.
061     *
062     * @param obj the attribute.
063     */
064    void visitCode(Code obj);
065
066    /**
067     * Visits a CodeException.
068     *
069     * @param obj the exception.
070     */
071    void visitCodeException(CodeException obj);
072
073    /**
074     * Visits a ConstantClass.
075     *
076     * @param obj the constant.
077     */
078    void visitConstantClass(ConstantClass obj);
079
080    /**
081     * Visits a ConstantDouble.
082     *
083     * @param obj the constant.
084     */
085    void visitConstantDouble(ConstantDouble obj);
086
087    /**
088     * Visits a ConstantDynamic.
089     *
090     * @param constantDynamic the constant.
091     * @since 6.3
092     */
093    default void visitConstantDynamic(final ConstantDynamic constantDynamic) {
094        // empty
095    }
096
097    /**
098     * Visits a ConstantFieldref.
099     *
100     * @param obj the constant.
101     */
102    void visitConstantFieldref(ConstantFieldref obj);
103
104    /**
105     * Visits a ConstantFloat.
106     *
107     * @param obj the constant.
108     */
109    void visitConstantFloat(ConstantFloat obj);
110
111    /**
112     * Visits a ConstantInteger.
113     *
114     * @param obj the constant.
115     */
116    void visitConstantInteger(ConstantInteger obj);
117
118    /**
119     * Visits a ConstantInterfaceMethodref.
120     *
121     * @param obj the constant.
122     */
123    void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj);
124
125    /**
126     * Visits a ConstantInvokeDynamic.
127     *
128     * @param obj the constant.
129     */
130    void visitConstantInvokeDynamic(ConstantInvokeDynamic obj);
131
132    /**
133     * Visits a ConstantLong.
134     *
135     * @param obj the constant.
136     */
137    void visitConstantLong(ConstantLong obj);
138
139    /**
140     * Visits a ConstantMethodHandle.
141     *
142     * @param obj the constant.
143     * @since 6.0
144     */
145    void visitConstantMethodHandle(ConstantMethodHandle obj);
146
147    /**
148     * Visits a ConstantMethodref.
149     *
150     * @param obj the constant.
151     */
152    void visitConstantMethodref(ConstantMethodref obj);
153
154    /**
155     * Visits a ConstantMethodType.
156     *
157     * @param obj the constant.
158     * @since 6.0
159     */
160    void visitConstantMethodType(ConstantMethodType obj);
161
162    /**
163     * Visits a ConstantModule.
164     *
165     * @param constantModule the constant.
166     * @since 6.1
167     */
168    void visitConstantModule(ConstantModule constantModule);
169
170    /**
171     * Visits a ConstantNameAndType.
172     *
173     * @param obj the constant.
174     */
175    void visitConstantNameAndType(ConstantNameAndType obj);
176
177    /**
178     * Visits a ConstantPackage.
179     *
180     * @param constantPackage the constant.
181     * @since 6.1
182     */
183    void visitConstantPackage(ConstantPackage constantPackage);
184
185    /**
186     * Visits a ConstantPool.
187     *
188     * @param obj the constant pool.
189     */
190    void visitConstantPool(ConstantPool obj);
191
192    /**
193     * Visits a ConstantString.
194     *
195     * @param obj the constant.
196     */
197    void visitConstantString(ConstantString obj);
198
199    /**
200     * Visits a ConstantUtf8.
201     *
202     * @param obj the constant.
203     */
204    void visitConstantUtf8(ConstantUtf8 obj);
205
206    /**
207     * Visits a ConstantValue attribute.
208     *
209     * @param obj the attribute.
210     */
211    void visitConstantValue(ConstantValue obj);
212
213    /**
214     * Visits a Deprecated attribute.
215     *
216     * @param obj the attribute.
217     */
218    void visitDeprecated(Deprecated obj);
219
220    /**
221     * Visits an EnclosingMethod attribute.
222     *
223     * @param obj the attribute.
224     * @since 6.0
225     */
226    void visitEnclosingMethod(EnclosingMethod obj);
227
228    /**
229     * Visits an ExceptionTable attribute.
230     *
231     * @param obj the attribute.
232     */
233    void visitExceptionTable(ExceptionTable obj);
234
235    /**
236     * Visits a Field.
237     *
238     * @param obj the field.
239     */
240    void visitField(Field obj);
241
242    /**
243     * Visits an InnerClass.
244     *
245     * @param obj the inner class.
246     */
247    void visitInnerClass(InnerClass obj);
248
249    /**
250     * Visits an InnerClasses attribute.
251     *
252     * @param obj the attribute.
253     */
254    void visitInnerClasses(InnerClasses obj);
255
256    /**
257     * Visits a JavaClass.
258     *
259     * @param obj the class.
260     */
261    void visitJavaClass(JavaClass obj);
262
263    /**
264     * Visits a LineNumber.
265     *
266     * @param obj the line number.
267     */
268    void visitLineNumber(LineNumber obj);
269
270    /**
271     * Visits a LineNumberTable attribute.
272     *
273     * @param obj the attribute.
274     */
275    void visitLineNumberTable(LineNumberTable obj);
276
277    /**
278     * Visits a LocalVariable.
279     *
280     * @param obj the local variable.
281     */
282    void visitLocalVariable(LocalVariable obj);
283
284    /**
285     * Visits a LocalVariableTable attribute.
286     *
287     * @param obj the attribute.
288     */
289    void visitLocalVariableTable(LocalVariableTable obj);
290
291    /**
292     * Visits a LocalVariableTypeTable attribute.
293     *
294     * @param obj the attribute.
295     * @since 6.0
296     */
297    void visitLocalVariableTypeTable(LocalVariableTypeTable obj);
298
299    /**
300     * Visits a Method.
301     *
302     * @param obj the method.
303     */
304    void visitMethod(Method obj);
305
306    /**
307     * Visits a MethodParameter.
308     *
309     * @param obj the method parameter.
310     * @since 6.4.0
311     */
312    default void visitMethodParameter(final MethodParameter obj) {
313        // empty
314    }
315
316    /**
317     * Visits a MethodParameters attribute.
318     *
319     * @param obj the attribute.
320     * @since 6.0
321     */
322    void visitMethodParameters(MethodParameters obj);
323
324    /**
325     * Visits a Module attribute.
326     *
327     * @param constantModule the module.
328     * @since 6.4.0
329     */
330    default void visitModule(final Module constantModule) {
331        // empty
332    }
333
334    /**
335     * Visits a ModuleExports entry.
336     *
337     * @param constantModule the module exports.
338     * @since 6.4.0
339     */
340    default void visitModuleExports(final ModuleExports constantModule) {
341        // empty
342    }
343
344    /**
345     * Visits a ModuleMainClass attribute.
346     *
347     * @param obj the attribute.
348     * @since 6.4.0
349     */
350    default void visitModuleMainClass(final ModuleMainClass obj) {
351        // empty
352    }
353
354    /**
355     * Visits a ModuleOpens entry.
356     *
357     * @param constantModule the module opens.
358     * @since 6.4.0
359     */
360    default void visitModuleOpens(final ModuleOpens constantModule) {
361        // empty
362    }
363
364    /**
365     * Visits a ModulePackages attribute.
366     *
367     * @param constantModule the module packages.
368     * @since 6.4.0
369     */
370    default void visitModulePackages(final ModulePackages constantModule) {
371        // empty
372    }
373
374    /**
375     * Visits a ModuleProvides entry.
376     *
377     * @param constantModule the module provides.
378     * @since 6.4.0
379     */
380    default void visitModuleProvides(final ModuleProvides constantModule) {
381        // empty
382    }
383
384    /**
385     * Visits a ModuleRequires entry.
386     *
387     * @param constantModule the module requires.
388     * @since 6.4.0
389     */
390    default void visitModuleRequires(final ModuleRequires constantModule) {
391        // empty
392    }
393
394    /**
395     * Visits a NestHost attribute.
396     *
397     * @param obj the attribute.
398     * @since 6.4.0
399     */
400    default void visitNestHost(final NestHost obj) {
401        // empty
402    }
403
404    /**
405     * Visits a NestMembers attribute.
406     *
407     * @param obj the attribute.
408     * @since 6.4.0
409     */
410    default void visitNestMembers(final NestMembers obj) {
411        // empty
412    }
413
414    /**
415     * Visits a ParameterAnnotations attribute.
416     *
417     * @param obj the attribute.
418     * @since 6.0
419     */
420    void visitParameterAnnotation(ParameterAnnotations obj);
421
422    /**
423     * Visits a ParameterAnnotationEntry.
424     *
425     * @param obj the annotation entry.
426     * @since 6.0
427     */
428    void visitParameterAnnotationEntry(ParameterAnnotationEntry obj);
429
430    /**
431     * Visits a {@link Record} object.
432     *
433     * @param obj Record to visit.
434     * @since 6.9.0
435     */
436    default void visitRecord(final Record obj) {
437        // empty
438    }
439
440    /**
441     * Visits a {@link RecordComponentInfo} object.
442     *
443     * @param record component to visit.
444     * @since 6.9.0
445     */
446    default void visitRecordComponent(final RecordComponentInfo record) {
447     // noop
448    }
449
450    /**
451     * Visits a Signature attribute.
452     *
453     * @param obj the attribute.
454     */
455    void visitSignature(Signature obj);
456
457    /**
458     * Visits a SourceFile attribute.
459     *
460     * @param obj the attribute.
461     */
462    void visitSourceFile(SourceFile obj);
463
464    /**
465     * Visits a StackMap attribute.
466     *
467     * @param obj the attribute.
468     */
469    void visitStackMap(StackMap obj);
470
471    /**
472     * Visits a StackMapEntry.
473     *
474     * @param obj the entry.
475     */
476    void visitStackMapEntry(StackMapEntry obj);
477
478    /**
479     * Visits a {@link StackMapType} object.
480     *
481     * @param obj object to visit.
482     * @since 6.8.0
483     */
484    default void visitStackMapType(final StackMapType obj) {
485      // empty
486    }
487
488    /**
489     * Visits a Synthetic attribute.
490     *
491     * @param obj the attribute.
492     */
493    void visitSynthetic(Synthetic obj);
494
495    /**
496     * Visits an Unknown attribute.
497     *
498     * @param obj the attribute.
499     */
500    void visitUnknown(Unknown obj);
501
502}