/*
* Copyright 2014 - 2020 Rafael Winterhalter
*
* 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 net.bytebuddy.description.type;
import net.bytebuddy.build.CachedReturnPlugin;
import net.bytebuddy.description.ByteCodeElement;
import net.bytebuddy.description.annotation.AnnotationDescription;
import net.bytebuddy.description.annotation.AnnotationList;
import net.bytebuddy.matcher.ElementMatcher;
import java.util.Collections;
import java.util.List;
A tokenized representation of a type variable.
/**
* A tokenized representation of a type variable.
*/
public class TypeVariableToken implements ByteCodeElement.Token<TypeVariableToken> {
The type variable's symbol.
/**
* The type variable's symbol.
*/
private final String symbol;
The type variable's upper bounds.
/**
* The type variable's upper bounds.
*/
private final List<? extends TypeDescription.Generic> bounds;
The annotations of the type variable.
/**
* The annotations of the type variable.
*/
private final List<? extends AnnotationDescription> annotations;
Creates a new type variable token without annotations.
Params: - symbol – The type variable's symbol.
- bounds – The type variable's upper bounds.
/**
* Creates a new type variable token without annotations.
*
* @param symbol The type variable's symbol.
* @param bounds The type variable's upper bounds.
*/
public TypeVariableToken(String symbol, List<? extends TypeDescription.Generic> bounds) {
this(symbol, bounds, Collections.<AnnotationDescription>emptyList());
}
Creates a new type variable token.
Params: - symbol – The type variable's symbol.
- bounds – The type variable's upper bounds.
- annotations – The annotations of the type variable.
/**
* Creates a new type variable token.
*
* @param symbol The type variable's symbol.
* @param bounds The type variable's upper bounds.
* @param annotations The annotations of the type variable.
*/
public TypeVariableToken(String symbol, List<? extends TypeDescription.Generic> bounds, List<? extends AnnotationDescription> annotations) {
this.symbol = symbol;
this.bounds = bounds;
this.annotations = annotations;
}
Transforms a type variable into a type variable token with its bounds detached.
Params: - typeVariable – A type variable in its attached state.
- matcher – A matcher that identifies types to detach from the upper bound types.
Returns: A token representing the detached type variable.
/**
* Transforms a type variable into a type variable token with its bounds detached.
*
* @param typeVariable A type variable in its attached state.
* @param matcher A matcher that identifies types to detach from the upper bound types.
* @return A token representing the detached type variable.
*/
public static TypeVariableToken of(TypeDescription.Generic typeVariable, ElementMatcher<? super TypeDescription> matcher) {
return new TypeVariableToken(typeVariable.getSymbol(),
typeVariable.getUpperBounds().accept(new TypeDescription.Generic.Visitor.Substitutor.ForDetachment(matcher)),
typeVariable.getDeclaredAnnotations());
}
Returns the type variable's symbol.
Returns: The type variable's symbol.
/**
* Returns the type variable's symbol.
*
* @return The type variable's symbol.
*/
public String getSymbol() {
return symbol;
}
Returns the type variable's upper bounds.
Returns: The type variable's upper bounds.
/**
* Returns the type variable's upper bounds.
*
* @return The type variable's upper bounds.
*/
public TypeList.Generic getBounds() {
return new TypeList.Generic.Explicit(bounds);
}
Returns the annotations on this type variable.
Returns: The annotations on this variable.
/**
* Returns the annotations on this type variable.
*
* @return The annotations on this variable.
*/
public AnnotationList getAnnotations() {
return new AnnotationList.Explicit(annotations);
}
{@inheritDoc}
/**
* {@inheritDoc}
*/
public TypeVariableToken accept(TypeDescription.Generic.Visitor<? extends TypeDescription.Generic> visitor) {
return new TypeVariableToken(symbol, getBounds().accept(visitor), annotations);
}
@Override
@CachedReturnPlugin.Enhance("hashCode")
public int hashCode() {
int result = symbol.hashCode();
result = 31 * result + bounds.hashCode();
result = 31 * result + annotations.hashCode();
return result;
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
} else if (!(other instanceof TypeVariableToken)) {
return false;
}
TypeVariableToken typeVariableToken = (TypeVariableToken) other;
return symbol.equals(typeVariableToken.symbol)
&& bounds.equals(typeVariableToken.bounds)
&& annotations.equals(typeVariableToken.annotations);
}
@Override
public String toString() {
return symbol;
}
}