/*
 * 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 org.jetbrains.annotations.Nullable;

/**
 * Visitor which can be used to visit Java types.
 * 
 * @author dsl
 */
public class PsiTypeVisitor<A> {
  @Nullable
  public A visitType(PsiType type) {
    return null;
  }

  @Nullable
  public A visitPrimitiveType(PsiPrimitiveType primitiveType) {
    return visitType(primitiveType);
  }

  @Nullable
  public A visitArrayType(PsiArrayType arrayType) {
    return visitType(arrayType);
  }

  @Nullable
  public A visitClassType(PsiClassType classType) {
    return visitType(classType);
  }

  @Nullable
  public A visitCapturedWildcardType(PsiCapturedWildcardType capturedWildcardType) {
    return visitWildcardType(capturedWildcardType.getWildcard());
  }

  @Nullable
  public A visitWildcardType(PsiWildcardType wildcardType) {
    return visitType(wildcardType);
  }

  @Nullable
  public A visitEllipsisType(PsiEllipsisType ellipsisType) {
    return visitArrayType(ellipsisType);
  }

  @Nullable
  public A visitDisjunctionType(PsiDisjunctionType disjunctionType) {
    return visitType(disjunctionType);
  }

  @Nullable
  public A visitIntersectionType(PsiIntersectionType intersectionType) {
    PsiType type = intersectionType.getConjuncts()[0];
    return type.accept(this);
  }

  @Nullable
  public A visitDiamondType(PsiDiamondType diamondType) {
    return visitType(diamondType);
  }
  
  @Nullable
  public A visitLambdaExpressionType(PsiLambdaExpressionType lambdaExpressionType) {
    final PsiLambdaExpression lambdaExpression = lambdaExpressionType.getExpression();
    final PsiType interfaceType = lambdaExpression.getFunctionalInterfaceType();
    if (interfaceType != null) return interfaceType.accept(this);
    return visitType(lambdaExpressionType);
  }
  
  public A visitMethodReferenceType(PsiMethodReferenceType methodReferenceType) {
    final PsiMethodReferenceExpression expression = methodReferenceType.getExpression();
    final PsiType interfaceType = expression.getFunctionalInterfaceType();
    if (interfaceType != null) return interfaceType.accept(this);
    return visitType(methodReferenceType);
  }
}
