/*
 * Copyright 2000-2012 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.intellij.psi;

import com.intellij.psi.javadoc.*;

@SuppressWarnings({"JavaDoc"})
public abstract class JavaElementVisitor extends PsiElementVisitor {

  public void visitAnonymousClass(PsiAnonymousClass aClass) {
    visitClass(aClass);
  }

  public void visitArrayAccessExpression(PsiArrayAccessExpression expression) {
    visitExpression(expression);
  }

  public void visitArrayInitializerExpression(PsiArrayInitializerExpression expression) {
    visitExpression(expression);
  }

  public void visitAssertStatement(PsiAssertStatement statement) {
    visitStatement(statement);
  }

  public void visitAssignmentExpression(PsiAssignmentExpression expression) {
    visitExpression(expression);
  }

  public void visitBinaryExpression(PsiBinaryExpression expression) {
    visitPolyadicExpression(expression);
  }

  public void visitBlockStatement(PsiBlockStatement statement) {
    visitStatement(statement);
  }

  public void visitBreakStatement(PsiBreakStatement statement) {
    visitStatement(statement);
  }

  public void visitClass(PsiClass aClass) {
    visitElement(aClass);
  }

  public void visitClassInitializer(PsiClassInitializer initializer) {
    visitElement(initializer);
  }

  public void visitClassObjectAccessExpression(PsiClassObjectAccessExpression expression) {
    visitExpression(expression);
  }

  public void visitCodeBlock(PsiCodeBlock block) {
    visitElement(block);
  }

  public void visitConditionalExpression(PsiConditionalExpression expression) {
    visitExpression(expression);
  }

  public void visitContinueStatement(PsiContinueStatement statement) {
    visitStatement(statement);
  }

  public void visitDeclarationStatement(PsiDeclarationStatement statement) {
    visitStatement(statement);
  }

  public void visitDocComment(PsiDocComment comment) {
    visitComment(comment);
  }

  public void visitDocTag(PsiDocTag tag) {
    visitElement(tag);
  }

  public void visitDocTagValue(PsiDocTagValue value) {
    visitElement(value);
  }

  public void visitDoWhileStatement(PsiDoWhileStatement statement) {
    visitStatement(statement);
  }

  public void visitEmptyStatement(PsiEmptyStatement statement) {
    visitStatement(statement);
  }

  public void visitExpression(PsiExpression expression) {
    visitElement(expression);
  }

  public void visitExpressionList(PsiExpressionList list) {
    visitElement(list);
  }

  public void visitExpressionListStatement(PsiExpressionListStatement statement) {
    visitStatement(statement);
  }

  public void visitExpressionStatement(PsiExpressionStatement statement) {
    visitStatement(statement);
  }

  public void visitField(PsiField field) {
    visitVariable(field);
  }

  public void visitForStatement(PsiForStatement statement) {
    visitStatement(statement);
  }

  public void visitForeachStatement(PsiForeachStatement statement) {
    visitStatement(statement);
  }

  public void visitIdentifier(PsiIdentifier identifier) {
    visitJavaToken(identifier);
  }

  public void visitIfStatement(PsiIfStatement statement) {
    visitStatement(statement);
  }

  public void visitImportList(PsiImportList list) {
    visitElement(list);
  }

  public void visitImportStatement(PsiImportStatement statement) {
    visitElement(statement);
  }

  public void visitImportStaticStatement(PsiImportStaticStatement statement) {
    visitElement(statement);
  }

  public void visitInlineDocTag(PsiInlineDocTag tag) {
    visitDocTag(tag);
  }

  public void visitInstanceOfExpression(PsiInstanceOfExpression expression) {
    visitExpression(expression);
  }

  public void visitJavaToken(PsiJavaToken token){
    visitElement(token);
  }

  public void visitKeyword(PsiKeyword keyword) {
    visitJavaToken(keyword);
  }

  public void visitLabeledStatement(PsiLabeledStatement statement) {
    visitStatement(statement);
  }

  public void visitLiteralExpression(PsiLiteralExpression expression) {
    visitExpression(expression);
  }

  public void visitLocalVariable(PsiLocalVariable variable) {
    visitVariable(variable);
  }

  public void visitMethod(PsiMethod method) {
    visitElement(method);
  }

  public void visitMethodCallExpression(PsiMethodCallExpression expression) {
    visitCallExpression(expression);
  }

  public void visitCallExpression(PsiCallExpression callExpression) {
    visitExpression(callExpression);
  }

  public void visitModifierList(PsiModifierList list) {
    visitElement(list);
  }

  public void visitNewExpression(PsiNewExpression expression) {
    visitCallExpression(expression);
  }

  public void visitPackage(PsiPackage aPackage) {
    visitElement(aPackage);
  }

  public void visitPackageStatement(PsiPackageStatement statement) {
    visitElement(statement);
  }

  public void visitParameter(PsiParameter parameter) {
    visitVariable(parameter);
  }

  public void visitParameterList(PsiParameterList list) {
    visitElement(list);
  }

  public void visitParenthesizedExpression(PsiParenthesizedExpression expression) {
    visitExpression(expression);
  }

  public void visitPostfixExpression(PsiPostfixExpression expression) {
    visitExpression(expression);
  }

  public void visitPrefixExpression(PsiPrefixExpression expression) {
    visitExpression(expression);
  }

  public void visitReferenceElement(PsiJavaCodeReferenceElement reference) {
    visitElement(reference);
  }

  public void visitImportStaticReferenceElement(PsiImportStaticReferenceElement reference) {
    visitElement(reference);
  }

  /**
   * PsiReferenceExpression is PsiReferenceElement and PsiExpression at the same time.
   * If we'd call both visitReferenceElement and visitExpression in default implementation
   * of this method we can easily stuck with exponential algorithm if the derived visitor
   * extends visitElement() and accepts children there.
   * PsiRecursiveElement visitor works that around and implements this method accordingly.
   * All other visitor must decide themselves what implementation (visitReferenceElement() or visitExpression() or none or LOG.error())
   * is appropriate for them.
   * @param expression
   */
  public void visitReferenceExpression(PsiReferenceExpression expression) {}

  public void visitMethodReferenceExpression(PsiMethodReferenceExpression expression) {
    visitReferenceExpression(expression);
  }

  public void visitReferenceList(PsiReferenceList list) {
    visitElement(list);
  }

  public void visitReferenceParameterList(PsiReferenceParameterList list) {
    visitElement(list);
  }

  public void visitTypeParameterList(PsiTypeParameterList list) {
    visitElement(list);
  }

  public void visitReturnStatement(PsiReturnStatement statement) {
    visitStatement(statement);
  }

  public void visitStatement(PsiStatement statement) {
    visitElement(statement);
  }

  public void visitSuperExpression(PsiSuperExpression expression) {
    visitExpression(expression);
  }

  public void visitSwitchLabelStatement(PsiSwitchLabelStatement statement) {
    visitStatement(statement);
  }

  public void visitSwitchStatement(PsiSwitchStatement statement) {
    visitStatement(statement);
  }

  public void visitSynchronizedStatement(PsiSynchronizedStatement statement) {
    visitStatement(statement);
  }

  public void visitThisExpression(PsiThisExpression expression) {
    visitExpression(expression);
  }

  public void visitThrowStatement(PsiThrowStatement statement) {
    visitStatement(statement);
  }

  public void visitTryStatement(PsiTryStatement statement) {
    visitStatement(statement);
  }

  public void visitCatchSection(PsiCatchSection section) {
    visitElement(section);
  }

  public void visitResourceList(PsiResourceList resourceList) {
    visitElement(resourceList);
  }

  public void visitResourceVariable(PsiResourceVariable resourceVariable) {
    visitLocalVariable(resourceVariable);
  }

  public void visitTypeElement(PsiTypeElement type) {
    visitElement(type);
  }

  public void visitTypeCastExpression(PsiTypeCastExpression expression) {
    visitExpression(expression);
  }

  public void visitVariable(PsiVariable variable) {
    visitElement(variable);
  }

  public void visitWhileStatement(PsiWhileStatement statement) {
    visitStatement(statement);
  }

  public void visitJavaFile(PsiJavaFile file){
    visitFile(file);
  }

  public void visitImplicitVariable(ImplicitVariable variable) {
    visitLocalVariable(variable);
  }

  public void visitDocToken(PsiDocToken token) {
    visitElement(token);
  }

  public void visitTypeParameter(PsiTypeParameter classParameter) {
    visitClass(classParameter);
  }

  public void visitAnnotation(PsiAnnotation annotation) {
    visitElement(annotation);
  }

  public void visitAnnotationParameterList(PsiAnnotationParameterList list) {
    visitElement(list);
  }

  public void visitAnnotationArrayInitializer(PsiArrayInitializerMemberValue initializer) {
    visitElement(initializer);
  }

  public void visitNameValuePair(PsiNameValuePair pair) {
    visitElement(pair);
  }

  public void visitAnnotationMethod(PsiAnnotationMethod method) {
    visitMethod(method);
  }

  public void visitEnumConstant(PsiEnumConstant enumConstant) {
    visitField(enumConstant);
  }

  public void visitEnumConstantInitializer(PsiEnumConstantInitializer enumConstantInitializer) {
    visitAnonymousClass(enumConstantInitializer);
  }

  public void visitCodeFragment(JavaCodeFragment codeFragment) {
    visitFile(codeFragment);
  }

  public void visitPolyadicExpression(PsiPolyadicExpression expression) {
    visitExpression(expression);
  }

  public void visitLambdaExpression(PsiLambdaExpression expression) {
    visitExpression(expression);
  }
}
