String typeName = referenceType.name();
boolean isAnonymousType = isAnonymousTypeName(typeName);
if (isAnonymousType) {
ClassType classType = (ClassType) referenceType;
List<InterfaceType> interfaceList = classType.interfaces();
String superClassName = classType.superclass().name();
if (hasEnclosingInstance) {
source.append("void "); //$NON-NLS-1$
source.append(getUniqueMethodName(EVAL_METHOD_NAME,
referenceType));
source.append("() {\nnew "); //$NON-NLS-1$
if (interfaceList.size() != 0) {
source.append(getDotName(interfaceList
.get(0).name()));
} else {
source.append(getDotName(superClassName));
}
source.append("()"); //$NON-NLS-1$
} else {
source.append("public class ").append(ANONYMOUS_CLASS_NAME).append(" "); //$NON-NLS-1$ //$NON-NLS-2$
if (interfaceList.size() != 0) {
source.append(" implements ").append(getDotName(interfaceList.get(0).name())); //$NON-NLS-1$
} else {
source.append(" extends ").append(getDotName(superClassName)); //$NON-NLS-1$
}
}
} else {
if (referenceType.isFinal()) {
source.append("final "); //$NON-NLS-1$
}
if (referenceType.isStatic()) {
source.append("static "); //$NON-NLS-1$
}
if (referenceType instanceof ClassType) {
ClassType classType = (ClassType) referenceType;
if (classType.isAbstract()) {
source.append("abstract "); //$NON-NLS-1$
}
source.append("class "); //$NON-NLS-1$
source.append(getSimpleName(typeName)).append(' ');
String genericSignature = referenceType.genericSignature();
if (genericSignature != null
&& isSourceLevelGreaterOrEqual(1, 5)) {
String[] typeParameters = Signature
.getTypeParameters(genericSignature);
if (typeParameters.length > 0) {
source.append('<');
source.append(Signature
.getTypeVariable(typeParameters[0]));
String[] typeParameterBounds = Signature
.getTypeParameterBounds(typeParameters[0]);
source.append(" extends ").append(Signature.toString(typeParameterBounds[0]).replace('/', '.')); //$NON-NLS-1$
for (int i = 1; i < typeParameterBounds.length; i++) {
source.append(" & ").append(Signature.toString(typeParameterBounds[i]).replace('/', '.')); //$NON-NLS-1$
}
for (int j = 1; j < typeParameters.length; j++) {
source.append(',')
.append(Signature
.getTypeVariable(typeParameters[j]));
typeParameterBounds = Signature
.getTypeParameterBounds(typeParameters[j]);
source.append(" extends ").append(Signature.toString(typeParameterBounds[0]).replace('/', '.')); //$NON-NLS-1$
for (int i = 1; i < typeParameterBounds.length; i++) {
source.append(" & ").append(Signature.toString(typeParameterBounds[i]).replace('/', '.')); //$NON-NLS-1$
}
}
source.append("> "); //$NON-NLS-1$
}
String[] superClassInterfaces = SignatureExt
.getTypeSuperClassInterfaces(genericSignature);
int length = superClassInterfaces.length;
if (length > 0) {
source.append("extends ").append(Signature.toString(superClassInterfaces[0]).replace('/', '.')); //$NON-NLS-1$
if (length > 1) {
source.append(" implements ").append(Signature.toString(superClassInterfaces[1]).replace('/', '.')); //$NON-NLS-1$
for (int i = 2; i < length; i++) {
source.append(',')
.append(Signature
.toString(superClassInterfaces[1]));
}
}
}
} else {
ClassType superClass = classType.superclass();
if (superClass != null) {
source.append("extends ").append(getDotName(superClass.name())).append(' '); //$NON-NLS-1$
}
List<InterfaceType> interfaces;
try {
interfaces = classType.interfaces();