interfaceList.add( TraitableBean.class.getName() );
}
String[] interfaces = interfaceList.toArray( new String[interfaceList.size()] );
// prepares a class definition
ClassDefinition def;
switch ( type.getKind() ) {
case TRAIT :
def = new ClassDefinition( fullName,
"java.lang.Object",
fullSuperTypes );
break;
case ENUM :
def = new EnumClassDefinition( fullName,
fullSuperTypes[0],
null );
break;
case CLASS :
default :
def = new ClassDefinition( fullName,
fullSuperTypes[0],
interfaces );
def.setTraitable( traitable );
}
for ( String annotationName : typeDescr.getAnnotationNames() ) {
Class annotation = resolveAnnotation( annotationName,
pkgRegistry.getTypeResolver() );
if ( annotation != null ) {
try {
AnnotationDefinition annotationDefinition = AnnotationDefinition.build( annotation,
typeDescr.getAnnotations().get( annotationName ).getValueMap(),
pkgRegistry.getTypeResolver() );
def.addAnnotation( annotationDefinition );
} catch ( NoSuchMethodException nsme ) {
this.results.add( new TypeDeclarationError( typeDescr,
"Annotated type " + fullName +
" - undefined property in @annotation " +
annotationName + ": " +
nsme.getMessage() + ";" ) );
}
} else {
def.addMetaData( annotationName, typeDescr.getAnnotation( annotationName ).getSingleValue() );
}
}
// add enum literals, if appropriate
if ( type.getKind() == TypeDeclaration.Kind.ENUM ) {
for ( EnumLiteralDescr lit : ((EnumDeclarationDescr) typeDescr).getLiterals() ) {
((EnumClassDefinition) def).addLiteral(
new EnumLiteralDefinition( lit.getName(), lit.getConstructorArgs() )
);
}
}
// fields definitions are created. will be used by subclasses, if any.
// Fields are SORTED in the process
if ( !typeDescr.getFields().isEmpty() ) {
PriorityQueue<FieldDefinition> fieldDefs = sortFields( typeDescr.getFields(),
pkgRegistry );
while ( !fieldDefs.isEmpty() ) {
FieldDefinition fld = fieldDefs.poll();
if ( unresolvedTypeDefinitions != null ) {
for ( TypeDefinition typeDef : unresolvedTypeDefinitions ) {
if ( fld.getTypeName().equals( typeDef.getTypeClassName() ) ) {
fld.setRecursive( true );
break;
}
}
}
def.addField( fld );
}
}
// check whether it is necessary to build the class or not
Class< ? > existingDeclarationClass = getExistingDeclarationClass( typeDescr );