Visitor.java
/*
* Copyright (c) 2001-2024, Jean Tessier
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Jean Tessier nor the names of his contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jeantessier.classreader;
import java.util.*;
public interface Visitor {
/*
* Classfile
*/
default void visitClassfiles(Collection<Classfile> classfiles) {
classfiles.forEach(classfile -> classfile.accept(this));
}
default void visitClassfile(Classfile classfile) {
// Do nothing
}
/*
* ConstantPool entries
*/
default void visitConstantPool(ConstantPool constantPool) {
// Do nothing
}
default void visitClass_info(Class_info entry) {
// Do nothing
}
default void visitFieldRef_info(FieldRef_info entry) {
// Do nothing
}
default void visitMethodRef_info(MethodRef_info entry) {
// Do nothing
}
default void visitInterfaceMethodRef_info(InterfaceMethodRef_info entry) {
// Do nothing
}
default void visitString_info(String_info entry) {
// Do nothing
}
default void visitInteger_info(Integer_info entry) {
// Do nothing
}
default void visitFloat_info(Float_info entry) {
// Do nothing
}
default void visitLong_info(Long_info entry) {
// Do nothing
}
default void visitDouble_info(Double_info entry) {
// Do nothing
}
default void visitNameAndType_info(NameAndType_info entry) {
// Do nothing
}
default void visitUTF8_info(UTF8_info entry) {
// Do nothing
}
default void visitMethodHandle_info(MethodHandle_info entry) {
// Do nothing
}
default void visitMethodType_info(MethodType_info entry) {
// Do nothing
}
default void visitDynamic_info(Dynamic_info entry) {
// Do nothing
}
default void visitInvokeDynamic_info(InvokeDynamic_info entry) {
// Do nothing
}
default void visitModule_info(Module_info entry) {
// Do nothing
}
default void visitPackage_info(Package_info entry) {
// Do nothing
}
default void visitUnusableEntry(UnusableEntry entry) {
// Do nothing
}
/*
* Features
*/
default void visitField_info(Field_info entry) {
// Do nothing
}
default void visitMethod_info(Method_info entry) {
// Do nothing
}
/*
* Attributes
*/
default void visitConstantValue_attribute(ConstantValue_attribute attribute) {
// Do nothing
}
default void visitCode_attribute(Code_attribute attribute) {
// Do nothing
}
default void visitExceptions_attribute(Exceptions_attribute attribute) {
attribute.getExceptions().forEach(exception -> exception.accept(this));
}
default void visitInnerClasses_attribute(InnerClasses_attribute attribute) {
attribute.getInnerClasses().forEach(innerClass -> innerClass.accept(this));
}
default void visitEnclosingMethod_attribute(EnclosingMethod_attribute attribute) {
// Do nothing
}
default void visitSynthetic_attribute(Synthetic_attribute attribute) {
// Do nothing
}
default void visitSignature_attribute(Signature_attribute attribute) {
// Do nothing
}
default void visitSourceFile_attribute(SourceFile_attribute attribute) {
// Do nothing
}
default void visitSourceDebugExtension_attribute(SourceDebugExtension_attribute attribute) {
// Do nothing
}
default void visitLineNumberTable_attribute(LineNumberTable_attribute attribute) {
attribute.getLineNumbers().forEach(lineNumber -> lineNumber.accept(this));
}
default void visitLocalVariableTable_attribute(LocalVariableTable_attribute attribute) {
attribute.getLocalVariables().forEach(localVariable -> localVariable.accept(this));
}
default void visitLocalVariableTypeTable_attribute(LocalVariableTypeTable_attribute attribute) {
// Do nothing
}
default void visitDeprecated_attribute(Deprecated_attribute attribute) {
// Do nothing
}
default void visitRuntimeVisibleAnnotations_attribute(RuntimeVisibleAnnotations_attribute attribute) {
// Do nothing
}
default void visitRuntimeInvisibleAnnotations_attribute(RuntimeInvisibleAnnotations_attribute attribute) {
// Do nothing
}
default void visitRuntimeVisibleParameterAnnotations_attribute(RuntimeVisibleParameterAnnotations_attribute attribute) {
// Do nothing
}
default void visitRuntimeInvisibleParameterAnnotations_attribute(RuntimeInvisibleParameterAnnotations_attribute attribute) {
// Do nothing
}
default void visitRuntimeVisibleTypeAnnotations_attribute(RuntimeVisibleTypeAnnotations_attribute attribute) {
// Do nothing
}
default void visitRuntimeInvisibleTypeAnnotations_attribute(RuntimeInvisibleTypeAnnotations_attribute attribute) {
// Do nothing
}
default void visitAnnotationDefault_attribute(AnnotationDefault_attribute attribute) {
attribute.getElemementValue().accept(this);
}
default void visitStackMapTable_attribute(StackMapTable_attribute attribute) {
attribute.getEntries().forEach(stackMapFrame -> stackMapFrame.accept(this));
}
default void visitBootstrapMethods_attribute(BootstrapMethods_attribute attribute) {
attribute.getBootstrapMethods().forEach(bootstrapMethod -> bootstrapMethod.accept(this));
}
default void visitMethodParameters_attribute(MethodParameters_attribute attribute) {
attribute.getMethodParameters().forEach(methodParameter -> methodParameter.accept(this));
}
default void visitModule_attribute(Module_attribute attribute) {
attribute.getRequires().forEach(moduleRequires -> moduleRequires.accept(this));
attribute.getExports().forEach(moduleExports -> moduleExports.accept(this));
attribute.getOpens().forEach(moduleOpens -> moduleOpens.accept(this));
attribute.getUses().forEach(moduleUses -> moduleUses.accept(this));
attribute.getProvides().forEach(moduleProvides -> moduleProvides.accept(this));
}
default void visitModulePackages_attribute(ModulePackages_attribute attribute) {
attribute.getPackages().forEach(modulePackage -> modulePackage.accept(this));
}
default void visitModuleMainClass_attribute(ModuleMainClass_attribute attribute) {
// Do nothing
}
default void visitNestHost_attribute(NestHost_attribute attribute) {
// Do nothing
}
default void visitNestMembers_attribute(NestMembers_attribute attribute) {
attribute.getMembers().forEach(nestMember -> nestMember.accept(this));
}
default void visitRecord_attribute(Record_attribute attribute) {
attribute.getRecordComponents().forEach(recordComponent -> recordComponent.accept(this));
}
default void visitPermittedSubclasses_attribute(PermittedSubclasses_attribute attribute) {
attribute.getSubclasses().forEach(permittedSubclass -> permittedSubclass.accept(this));
}
default void visitCustom_attribute(Custom_attribute attribute) {
// Do nothing
}
/*
* Attribute helpers
*/
default void visitInstruction(Instruction instruction) {
// Do nothing
}
default void visitExceptionHandler(ExceptionHandler helper) {
// Do nothing
}
default void visitInnerClass(InnerClass helper) {
// Do nothing
}
default void visitLineNumber(LineNumber helper) {
// Do nothing
}
default void visitLocalVariable(LocalVariable helper) {
// Do nothing
}
default void visitLocalVariableType(LocalVariableType helper) {
// Do nothing
}
default void visitBootstrapMethod(BootstrapMethod helper) {
helper.getBootstrapMethod().accept(this);
helper.getArguments().forEach(argument -> argument.accept(this));
}
default void visitMethodParameter(MethodParameter helper) {
// Do nothing
}
default void visitModuleRequires(ModuleRequires helper) {
// Do nothing
}
default void visitModuleExports(ModuleExports helper) {
helper.getExportsTos().forEach(moduleExportsTo -> moduleExportsTo.accept(this));
}
default void visitModuleExportsTo(ModuleExportsTo helper) {
// Do nothing
}
default void visitModuleOpens(ModuleOpens helper) {
helper.getOpensTos().forEach(moduleOpensTo -> moduleOpensTo.accept(this));
}
default void visitModuleOpensTo(ModuleOpensTo helper) {
// Do nothing
}
default void visitModuleUses(ModuleUses helper) {
// Do nothing
}
default void visitModuleProvides(ModuleProvides helper) {
helper.getProvidesWiths().forEach(moduleProvidesWith -> moduleProvidesWith.accept(this));
}
default void visitModuleProvidesWith(ModuleProvidesWith helper) {
// Do nothing
}
default void visitModulePackage(ModulePackage helper) {
// Do nothing
}
default void visitNestMember(NestMember helper) {
// Do nothing
}
default void visitRecordComponent_info(RecordComponent_info helper) {
helper.getAttributes().forEach(attribute -> attribute.accept(this));
}
default void visitPermittedSubclass(PermittedSubclass helper) {
// Do nothing
}
/*
* Annotations
*/
default void visitAnnotation(Annotation helper) {
helper.getElementValuePairs().forEach(elementValuePair -> elementValuePair.accept(this));
}
default void visitParameterAnnotation(ParameterAnnotation helper) {
helper.getAnnotations().forEach(annotation -> annotation.accept(this));
}
default void visitTypeAnnotation(TypeAnnotation helper) {
helper.getTarget().accept(this);
helper.getTargetPath().accept(this);
helper.getElementValuePairs().forEach(elementValuePair -> elementValuePair.accept(this));
}
default void visitElementValuePair(ElementValuePair helper) {
helper.getElementValue().accept(this);
}
default void visitByteConstantElementValue(ByteConstantElementValue helper) {
// Do nothing
}
default void visitCharConstantElementValue(CharConstantElementValue helper) {
// Do nothing
}
default void visitDoubleConstantElementValue(DoubleConstantElementValue helper) {
// Do nothing
}
default void visitFloatConstantElementValue(FloatConstantElementValue helper) {
// Do nothing
}
default void visitIntegerConstantElementValue(IntegerConstantElementValue helper) {
// Do nothing
}
default void visitLongConstantElementValue(LongConstantElementValue helper) {
// Do nothing
}
default void visitShortConstantElementValue(ShortConstantElementValue helper) {
// Do nothing
}
default void visitBooleanConstantElementValue(BooleanConstantElementValue helper) {
// Do nothing
}
default void visitStringConstantElementValue(StringConstantElementValue helper) {
// Do nothing
}
default void visitEnumElementValue(EnumElementValue helper) {
// Do nothing
}
default void visitClassElementValue(ClassElementValue helper) {
// Do nothing
}
default void visitAnnotationElementValue(AnnotationElementValue helper) {
helper.getAnnotation().accept(this);
}
default void visitArrayElementValue(ArrayElementValue helper) {
helper.getValues().forEach(elementValue -> elementValue.accept(this));
}
default void visitTypeParameterTarget(TypeParameterTarget helper) {
// Do nothing
}
default void visitSupertypeTarget(SupertypeTarget helper) {
// Do nothing
}
default void visitTypeParameterBoundTarget(TypeParameterBoundTarget helper) {
// Do nothing
}
default void visitEmptyTarget(EmptyTarget helper) {
// Do nothing
}
default void visitFormalParameterTarget(FormalParameterTarget helper) {
// Do nothing
}
default void visitThrowsTarget(ThrowsTarget helper) {
// Do nothing
}
default void visitLocalvarTarget(LocalvarTarget helper) {
helper.getTable().forEach(entry -> entry.accept(this));
}
default void visitCatchTarget(CatchTarget helper) {
// Do nothing
}
default void visitOffsetTarget(OffsetTarget helper) {
// Do nothing
}
default void visitTypeArgumentTarget(TypeArgumentTarget helper) {
// Do nothing
}
default void visitLocalvarTableEntry(LocalvarTableEntry helper) {
// Do nothing
}
default void visitTypePath(TypePath helper) {
helper.getPath().forEach(entry -> entry.accept(this));
}
default void visitTypePathEntry(TypePathEntry helper) {
// Do nothing
}
default void visitSameFrame(SameFrame helper) {
// Do nothing
}
default void visitSameLocals1StackItemFrame(SameLocals1StackItemFrame helper) {
// Do nothing
}
default void visitSameLocals1StackItemFrameExtended(SameLocals1StackItemFrameExtended helper) {
// Do nothing
}
default void visitChopFrame(ChopFrame helper) {
// Do nothing
}
default void visitSameFrameExtended(SameFrameExtended helper) {
// Do nothing
}
default void visitAppendFrame(AppendFrame helper) {
// Do nothing
}
default void visitFullFrame(FullFrame helper) {
// Do nothing
}
default void visitTopVariableInfo(TopVariableInfo helper) {
// Do nothing
}
default void visitIntegerVariableInfo(IntegerVariableInfo helper) {
// Do nothing
}
default void visitFloatVariableInfo(FloatVariableInfo helper) {
// Do nothing
}
default void visitLongVariableInfo(LongVariableInfo helper) {
// Do nothing
}
default void visitDoubleVariableInfo(DoubleVariableInfo helper) {
// Do nothing
}
default void visitNullVariableInfo(NullVariableInfo helper) {
// Do nothing
}
default void visitUninitializedThisVariableInfo(UninitializedThisVariableInfo helper) {
// Do nothing
}
default void visitObjectVariableInfo(ObjectVariableInfo helper) {
helper.getClassInfo().accept(this);
}
default void visitUninitializedVariableInfo(UninitializedVariableInfo helper) {
// Do nothing
}
}