/*
 * FindBugs - Find bugs in Java programs
 * Copyright (C) 2003,2004 University of Maryland
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package edu.umd.cs.findbugs.visitclass;

import java.io.PrintStream;

import org.apache.bcel.classfile.Attribute;
import org.apache.bcel.classfile.Code;
import org.apache.bcel.classfile.CodeException;
import org.apache.bcel.classfile.Constant;
import org.apache.bcel.classfile.ConstantCP;
import org.apache.bcel.classfile.ConstantClass;
import org.apache.bcel.classfile.ConstantDouble;
import org.apache.bcel.classfile.ConstantFieldref;
import org.apache.bcel.classfile.ConstantFloat;
import org.apache.bcel.classfile.ConstantInteger;
import org.apache.bcel.classfile.ConstantInterfaceMethodref;
import org.apache.bcel.classfile.ConstantLong;
import org.apache.bcel.classfile.ConstantMethodref;
import org.apache.bcel.classfile.ConstantNameAndType;
import org.apache.bcel.classfile.ConstantPool;
import org.apache.bcel.classfile.ConstantString;
import org.apache.bcel.classfile.ConstantUtf8;
import org.apache.bcel.classfile.ConstantValue;
import org.apache.bcel.classfile.ExceptionTable;
import org.apache.bcel.classfile.Field;
import org.apache.bcel.classfile.InnerClass;
import org.apache.bcel.classfile.InnerClasses;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.classfile.LineNumber;
import org.apache.bcel.classfile.LineNumberTable;
import org.apache.bcel.classfile.LocalVariable;
import org.apache.bcel.classfile.LocalVariableTable;
import org.apache.bcel.classfile.LocalVariableTypeTable;
import org.apache.bcel.classfile.Method;
import org.apache.bcel.classfile.Signature;
import org.apache.bcel.classfile.SourceFile;
import org.apache.bcel.classfile.StackMap;
import org.apache.bcel.classfile.StackMapEntry;
import org.apache.bcel.classfile.Synthetic;
import org.apache.bcel.classfile.Unknown;
import org.apache.bcel.classfile.Visitor;

/**
 * Fixedup of from org.apache.bcel.classfile.Visitor
 *
 * @author <A HREF="http://www.cs.umd.edu/~pugh">William Pugh</A>
 * @version 980818
 */
public abstract class BetterVisitor implements Visitor {

    /**
     * clone() is overridden to change access control from protected to public.
     * Originally we compelled subclasses not to throw
     * CloneNotSupportedException, but that was unfriendly to some third-parties
     * with existing code.
     */
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    // //////////////// In short form //////////////////////
    // General classes
    public void visit(JavaClass obj) {
    }

    public void visit(ConstantPool obj) {
    }

    public void visit(Field obj) {
    }

    public void visit(Method obj) {
    }

    // Constants

    public void visit(Constant obj) {
    }

    public void visit(ConstantCP obj) {
        visit((Constant) obj);
    }

    public void visit(ConstantMethodref obj) {
        visit((ConstantCP) obj);
    }

    public void visit(ConstantFieldref obj) {
        visit((ConstantCP) obj);
    }

    public void visit(ConstantInterfaceMethodref obj) {
        visit((ConstantCP) obj);
    }

    public void visit(ConstantClass obj) {
        visit((Constant) obj);
    }

    public void visit(ConstantDouble obj) {
        visit((Constant) obj);
    }

    public void visit(ConstantFloat obj) {
        visit((Constant) obj);
    }

    public void visit(ConstantInteger obj) {
        visit((Constant) obj);
    }

    public void visit(ConstantLong obj) {
        visit((Constant) obj);
    }

    public void visit(ConstantNameAndType obj) {
        visit((Constant) obj);
    }

    public void visit(ConstantString obj) {
        visit((Constant) obj);
    }

    public void visit(ConstantUtf8 obj) {
        visit((Constant) obj);
    }

    // Attributes
    public void visit(Attribute obj) {
    }

    public void visit(Code obj) {
        visit((Attribute) obj);
    }

    public void visit(ConstantValue obj) {
        visit((Attribute) obj);
    }

    public void visit(ExceptionTable obj) {
        visit((Attribute) obj);
    }

    public void visit(InnerClasses obj) {
        visit((Attribute) obj);
    }

    public void visit(LineNumberTable obj) {
        visit((Attribute) obj);
    }

    public void visit(LocalVariableTable obj) {
        visit((Attribute) obj);
    }

    public void visit(LocalVariableTypeTable obj) {
        // must explicitly override to get functionality
    }

    public void visit(SourceFile obj) {
        visit((Attribute) obj);
    }

    public void visit(Synthetic obj) {
        visit((Attribute) obj);
    }

    public void visit(org.apache.bcel.classfile.Deprecated obj) {
        visit((Attribute) obj);
    }

    public void visit(Unknown obj) {
        visit((Attribute) obj);
    }

    public void visit(Signature obj) {
        visit((Attribute) obj);
    }

    // Extra classes (i.e. leaves in this context)
    public void visit(InnerClass obj) {
    }

    public void visit(LocalVariable obj) {
    }

    public void visit(LineNumber obj) {
    }

    public void visit(CodeException obj) {
    }

    public void visit(StackMapEntry obj) {
    }

    // Attributes
    @Override
    public void visitCode(Code obj) {
        visit(obj);
    }

    @Override
    public void visitCodeException(CodeException obj) {
        visit(obj);
    }

    // Constants
    @Override
    public void visitConstantClass(ConstantClass obj) {
        visit(obj);
    }

    @Override
    public void visitConstantDouble(ConstantDouble obj) {
        visit(obj);
    }

    @Override
    public void visitConstantFieldref(ConstantFieldref obj) {
        visit(obj);
    }

    @Override
    public void visitConstantFloat(ConstantFloat obj) {
        visit(obj);
    }

    @Override
    public void visitConstantInteger(ConstantInteger obj) {
        visit(obj);
    }

    @Override
    public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) {
        visit(obj);
    }

    @Override
    public void visitConstantLong(ConstantLong obj) {
        visit(obj);
    }

    @Override
    public void visitConstantMethodref(ConstantMethodref obj) {
        visit(obj);
    }

    @Override
    public void visitConstantNameAndType(ConstantNameAndType obj) {
        visit(obj);
    }

    @Override
    public void visitConstantPool(ConstantPool obj) {
        visit(obj);
    }

    @Override
    public void visitConstantString(ConstantString obj) {
        visit(obj);
    }

    @Override
    public void visitConstantUtf8(ConstantUtf8 obj) {
        visit(obj);
    }

    @Override
    public void visitConstantValue(ConstantValue obj) {
        visit(obj);
    }

    @Override
    public void visitDeprecated(org.apache.bcel.classfile.Deprecated obj) {
        visit(obj);
    }

    @Override
    public void visitExceptionTable(ExceptionTable obj) {
        visit(obj);
    }

    @Override
    public void visitField(Field obj) {
        visit(obj);
    }

    // Extra classes (i.e. leaves in this context)
    @Override
    public void visitInnerClass(InnerClass obj) {
        visit(obj);
    }

    @Override
    public void visitInnerClasses(InnerClasses obj) {
        visit(obj);
    }

    // General classes
    @Override
    public void visitJavaClass(JavaClass obj) {
        visit(obj);
    }

    @Override
    public void visitLineNumber(LineNumber obj) {
        visit(obj);
    }

    @Override
    public void visitLineNumberTable(LineNumberTable obj) {
        visit(obj);
    }

    @Override
    public void visitLocalVariable(LocalVariable obj) {
        visit(obj);
    }

    @Override
    public void visitLocalVariableTable(LocalVariableTable obj) {
        visit(obj);
    }

    @Override
    public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) {
        visit(obj);
    }

    @Override
    public void visitMethod(Method obj) {
        visit(obj);
    }

    @Override
    public void visitSignature(Signature obj) {
        visit(obj);
    }

    @Override
    public void visitSourceFile(SourceFile obj) {
        visit(obj);
    }

    @Override
    public void visitSynthetic(Synthetic obj) {
        visit(obj);
    }

    @Override
    public void visitUnknown(Unknown obj) {
        visit(obj);
    }

    @Override
    public void visitStackMapEntry(StackMapEntry obj) {
        visit(obj);
    }

    @Override
    public void visitStackMap(StackMap obj) {
        visit(obj);
    }

    public void report(PrintStream out) {
    }

}
