/*
* 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;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.description.type.TypeList;
import static net.bytebuddy.matcher.ElementMatchers.named;
A type variable source represents a code element that can declare type variables.
/**
* A type variable source represents a code element that can declare type variables.
*/
public interface TypeVariableSource extends ModifierReviewable.OfAbstraction {
Indicates that a type variable source is undefined.
/**
* Indicates that a type variable source is undefined.
*/
TypeVariableSource UNDEFINED = null;
Returns the type variables that are declared by this element.
Returns: The type variables that are declared by this element.
/**
* Returns the type variables that are declared by this element.
*
* @return The type variables that are declared by this element.
*/
TypeList.Generic getTypeVariables();
Returns the enclosing source of type variables that are valid in the scope of this type variable source.
Returns: The enclosing source or null
if no such source exists.
/**
* Returns the enclosing source of type variables that are valid in the scope of this type variable source.
*
* @return The enclosing source or {@code null} if no such source exists.
*/
TypeVariableSource getEnclosingSource();
Returns true
if type variables declared by this type variable source allow dynamic type inference. Returns: true
if type variables declared by this type variable source allow dynamic type inference.
/**
* Returns {@code true} if type variables declared by this type variable source allow dynamic type inference.
*
* @return {@code true} if type variables declared by this type variable source allow dynamic type inference.
*/
boolean isInferrable();
Finds a particular variable with the given name in the closes type variable source that is visible from this instance.
Params: - symbol – The symbolic name of the type variable.
Returns: The type variable.
/**
* Finds a particular variable with the given name in the closes type variable source that is visible from this instance.
*
* @param symbol The symbolic name of the type variable.
* @return The type variable.
*/
TypeDescription.Generic findVariable(String symbol);
Applies a visitor on this type variable source.
Params: - visitor – The visitor to apply.
Type parameters: - <T> – The visitor's return type.
Returns: The visitor's return value.
/**
* Applies a visitor on this type variable source.
*
* @param visitor The visitor to apply.
* @param <T> The visitor's return type.
* @return The visitor's return value.
*/
<T> T accept(Visitor<T> visitor);
Checks if this type variable source has a generic declaration. This means:
- A type declares type variables or is an inner class of a type with a generic declaration.
- A method declares at least one type variable.
Returns: true
if this type code element has a generic declaration.
/**
* Checks if this type variable source has a generic declaration. This means:
* <ul>
* <li>A type declares type variables or is an inner class of a type with a generic declaration.</li>
* <li>A method declares at least one type variable.</li>
* </ul>
*
* @return {@code true} if this type code element has a generic declaration.
*/
boolean isGenerified();
A visitor that can be applied to a type variable source.
Type parameters: - <T> – The visitor's return type.
/**
* A visitor that can be applied to a type variable source.
*
* @param <T> The visitor's return type.
*/
interface Visitor<T> {
Applies the visitor on a type.
Params: - typeDescription – The type onto which this visitor is applied.
Returns: The visitor's return value.
/**
* Applies the visitor on a type.
*
* @param typeDescription The type onto which this visitor is applied.
* @return The visitor's return value.
*/
T onType(TypeDescription typeDescription);
Applies the visitor on a method.
Params: - methodDescription – The method onto which this visitor is applied.
Returns: The visitor's return value.
/**
* Applies the visitor on a method.
*
* @param methodDescription The method onto which this visitor is applied.
* @return The visitor's return value.
*/
T onMethod(MethodDescription.InDefinedShape methodDescription);
A none-operational implementation of a type variable visitor that simply returns the visited source.
/**
* A none-operational implementation of a type variable visitor that simply returns the visited source.
*/
enum NoOp implements Visitor<TypeVariableSource> {
The singleton instance.
/**
* The singleton instance.
*/
INSTANCE;
{@inheritDoc}
/**
* {@inheritDoc}
*/
public TypeVariableSource onType(TypeDescription typeDescription) {
return typeDescription;
}
{@inheritDoc}
/**
* {@inheritDoc}
*/
public TypeVariableSource onMethod(MethodDescription.InDefinedShape methodDescription) {
return methodDescription;
}
}
}
An abstract base implementation of a type variable source.
/**
* An abstract base implementation of a type variable source.
*/
abstract class AbstractBase extends ModifierReviewable.AbstractBase implements TypeVariableSource {
{@inheritDoc}
/**
* {@inheritDoc}
*/
public TypeDescription.Generic findVariable(String symbol) {
TypeList.Generic typeVariables = getTypeVariables().filter(named(symbol));
if (typeVariables.isEmpty()) {
TypeVariableSource enclosingSource = getEnclosingSource();
return enclosingSource == null
? TypeDescription.Generic.UNDEFINED
: enclosingSource.findVariable(symbol);
} else {
return typeVariables.getOnly();
}
}
}
}