R accept(final TypeMetadataVisitor visitor, final
+ P parameter) {
+ return visitor.visitClassType(this, parameter);
+ }
+
+ @Override
+ public String getSimpleName() {
+ return _shortName != null ? _shortName : _name;
+ }
+
+ @Override
+ public boolean isGenericDefinition() {
+ return hasGenericParameters();
+ }
+
+ @Override
+ public List getGenericParameters() {
+ return _genericParameters;
+ }
+
+ @Override
+ public TypeReference makeGenericType(final List extends
+ TypeReference> typeArguments) {
+ VerifyArgument.noNullElementsAndNotEmpty(typeArguments,
+ "typeArguments");
+
+ return new UnresolvedGenericType(
+ this,
+ ArrayUtilities.asUnmodifiableList(typeArguments.toArray(new
+ TypeReference[typeArguments.size()]))
+ );
+ }
+
+ @Override
+ public TypeReference makeGenericType(final TypeReference...
+ typeArguments) {
+ VerifyArgument.noNullElementsAndNotEmpty(typeArguments,
+ "typeArguments");
+
+ return new UnresolvedGenericType(
+ this,
+ ArrayUtilities.asUnmodifiableList(typeArguments.clone())
+ );
+ }
+
+ @Override
+ public TypeDefinition resolve() {
+ return _resolver.resolve(this);
+ }
+
+ @Override
+ public FieldDefinition resolve(final FieldReference field) {
+ return _resolver.resolve(field);
+ }
+
+ @Override
+ public MethodDefinition resolve(final MethodReference method) {
+ return _resolver.resolve(method);
+ }
+
+ @Override
+ public TypeDefinition resolve(final TypeReference type) {
+ return _resolver.resolve(type);
+ }
+ }
+
+ private final class UnresolvedGenericType extends TypeReference
+ implements IGenericInstance {
+ private final TypeReference _genericDefinition;
+ private final List _typeParameters;
+
+ private String _signature;
+
+ UnresolvedGenericType(final TypeReference genericDefinition, final
+ List typeParameters) {
+ _genericDefinition = genericDefinition;
+ _typeParameters = typeParameters;
+ }
+
+ @Override
+ public TypeReference getElementType() {
+ return null;
+ }
+
+ @Override
+ public R accept(final TypeMetadataVisitor visitor, final
+ P parameter) {
+ return visitor.visitParameterizedType(this, parameter);
+ }
+
+ @Override
+ public String getName() {
+ return _genericDefinition.getName();
+ }
+
+ @Override
+ public String getPackageName() {
+ return _genericDefinition.getPackageName();
+ }
+
+ @Override
+ public TypeReference getDeclaringType() {
+ return _genericDefinition.getDeclaringType();
+ }
+
+ @Override
+ public String getSimpleName() {
+ return _genericDefinition.getSimpleName();
+ }
+
+ @Override
+ public String getFullName() {
+ return _genericDefinition.getFullName();
+ }
+
+ @Override
+ public String getInternalName() {
+ return _genericDefinition.getInternalName();
+ }
+
+ @Override
+ public String getSignature() {
+ if (_signature == null) {
+ _signature = super.getSignature();
+ }
+ return _signature;
+ }
+
+ @Override
+ public String getErasedSignature() {
+ return _genericDefinition.getErasedSignature();
+ }
+
+ @Override
+ public boolean isGenericDefinition() {
+ return false;
+ }
+
+ @Override
+ public boolean isGenericType() {
+ return true;
+ }
+
+ @Override
+ public List getGenericParameters() {
+ if (!_genericDefinition.isGenericDefinition()) {
+ final TypeDefinition resolvedDefinition = _genericDefinition
+ .resolve();
+
+ if (resolvedDefinition != null) {
+ return resolvedDefinition.getGenericParameters();
+ }
+ }
+
+ return _genericDefinition.getGenericParameters();
+ }
+
+ @Override
+ public boolean hasTypeArguments() {
+ return true;
+ }
+
+ @Override
+ public List getTypeArguments() {
+ return _typeParameters;
+ }
+
+ @Override
+ public IGenericParameterProvider getGenericDefinition() {
+ return _genericDefinition;
+ }
+
+ @Override
+ public TypeReference getUnderlyingType() {
+ return _genericDefinition;
+ }
+
+ @Override
+ public TypeDefinition resolve() {
+ return _resolver.resolve(this);
+ }
+
+ @Override
+ public FieldDefinition resolve(final FieldReference field) {
+ return _resolver.resolve(field);
+ }
+
+ @Override
+ public MethodDefinition resolve(final MethodReference method) {
+ return _resolver.resolve(method);
+ }
+
+ @Override
+ public TypeDefinition resolve(final TypeReference type) {
+ return _resolver.resolve(type);
+ }
+ }
+}
+