/* * Copyright 2015 Lukas Krejci * * 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 org.revapi.java.spi; import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.lang.model.type.ArrayType; import javax.lang.model.type.DeclaredType; import javax.lang.model.type.ErrorType; import javax.lang.model.type.ExecutableType; import javax.lang.model.type.IntersectionType; import javax.lang.model.type.NoType; import javax.lang.model.type.NullType; import javax.lang.model.type.PrimitiveType; import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeVariable; import javax.lang.model.type.UnionType; import javax.lang.model.type.WildcardType; import javax.lang.model.util.SimpleTypeVisitor7; /** * Similar to {@link org.revapi.java.spi.ElementPairVisitor} but provides a visitor to visit two type mirrors * of the same type. * * <p>Typical usage: * <pre><code> * javax.lang.model.type.TypeMirror t1 = ...; * javax.lang.model.type.TypeMirror t2 = ...; * * t1.accept(new TypeMirrorPairVisitor<Void>() { * * protected Void visitArray(ArrayType t1, ArrayType t2) { * ... * } * }, t2); * </code></pre> * * @see org.revapi.java.spi.ElementPairVisitor * * @author Lukas Krejci * @since 0.1 */ public class TypeMirrorPairVisitor<R> extends SimpleTypeVisitor7<R, TypeMirror> { @SuppressWarnings("UnusedParameters") protected R unmatchedAction(@Nonnull TypeMirror type, @Nullable TypeMirror otherType) { return null; } protected R defaultMatchAction(@Nonnull TypeMirror type, @Nullable TypeMirror otherType) { return unmatchedAction(type, otherType); } @Override public final R visitPrimitive(PrimitiveType type, TypeMirror otherType) { return otherType instanceof PrimitiveType ? visitPrimitive(type, (PrimitiveType) otherType) : unmatchedAction(type, otherType); } protected R visitPrimitive(PrimitiveType type, PrimitiveType otherType) { return defaultMatchAction(type, otherType); } @Override public final R visitNull(NullType type, TypeMirror otherType) { return otherType instanceof NullType ? visitNull(type, (NullType) otherType) : unmatchedAction(type, otherType); } protected R visitNull(NullType type, NullType otherType) { return defaultMatchAction(type, otherType); } @Override public final R visitArray(ArrayType type, TypeMirror otherType) { return otherType instanceof ArrayType ? visitArray(type, (ArrayType) otherType) : unmatchedAction(type, otherType); } protected R visitArray(ArrayType type, ArrayType otherType) { return defaultMatchAction(type, otherType); } @Override public final R visitDeclared(DeclaredType type, TypeMirror otherType) { return otherType instanceof DeclaredType ? visitDeclared(type, (DeclaredType) otherType) : unmatchedAction(type, otherType); } protected R visitDeclared(DeclaredType type, DeclaredType otherType) { return defaultMatchAction(type, otherType); } @Override public final R visitError(ErrorType type, TypeMirror otherType) { return otherType instanceof ErrorType ? visitError(type, (ErrorType) otherType) : unmatchedAction(type, otherType); } protected R visitError(ErrorType type, ErrorType otherType) { return defaultMatchAction(type, otherType); } @Override public final R visitTypeVariable(TypeVariable type, TypeMirror otherType) { return otherType instanceof TypeVariable ? visitTypeVariable(type, (TypeVariable) otherType) : unmatchedAction(type, otherType); } protected R visitTypeVariable(TypeVariable type, TypeVariable otherType) { return defaultMatchAction(type, otherType); } @Override public final R visitWildcard(WildcardType type, TypeMirror otherType) { return otherType instanceof WildcardType ? visitWildcard(type, (WildcardType) otherType) : unmatchedAction(type, otherType); } protected R visitWildcard(WildcardType type, WildcardType otherType) { return defaultMatchAction(type, otherType); } @Override public final R visitExecutable(ExecutableType type, TypeMirror otherType) { return otherType instanceof ExecutableType ? visitExecutable(type, (ExecutableType) otherType) : unmatchedAction(type, otherType); } protected R visitExecutable(ExecutableType type, ExecutableType otherType) { return defaultMatchAction(type, otherType); } @Override public final R visitNoType(NoType type, TypeMirror otherType) { return otherType instanceof NoType ? visitNoType(type, (NoType) otherType) : unmatchedAction(type, otherType); } protected R visitNoType(NoType type, NoType otherType) { return defaultMatchAction(type, otherType); } @Override public final R visitIntersection(IntersectionType type, TypeMirror otherType) { return otherType instanceof IntersectionType ? visitIntersection(type, (IntersectionType) otherType) : unmatchedAction(type, otherType); } protected R visitIntersection(IntersectionType type, IntersectionType otherType) { return defaultMatchAction(type, otherType); } @Override public final R visitUnion(UnionType type, TypeMirror otherType) { return otherType instanceof UnionType ? visitUnion(type, (UnionType) otherType) : unmatchedAction(type, otherType); } protected R visitUnion(UnionType type, UnionType otherType) { return defaultMatchAction(type, otherType); } @Override public R visitUnknown(TypeMirror type, TypeMirror otherType) { return unmatchedAction(type, otherType); } }