package fr.lteconsulting.hexa.rebind.classinfo;
import com.google.gwt.core.ext.Generator;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JParameterizedType;
import com.google.gwt.core.ext.typeinfo.NotFoundException;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
public class ClazzGenerator extends Generator
{
// Context and logger for code generation
TreeLogger logger;
GeneratorContext context;
// asked type name
String askedTypeName;
// type for which we provide information
JClassType reflectedType;
// generated class name
String generatedClassName;
private JClassType getReflectedType( TypeOracle typeOracle, String askedTypeName ) throws UnableToCompleteException
{
JClassType askedType;
try
{
askedType = typeOracle.getType( askedTypeName );
}
catch( NotFoundException e )
{
throw new UnableToCompleteException();
}
for( JClassType classType : askedType.getImplementedInterfaces() )
{
if( !classType.getQualifiedSourceName().equals( "fr.lteconsulting.hexa.classinfo.Clazz" ) )
continue;
JParameterizedType parametrized = classType.isParameterized();
JClassType[] typeArgs = parametrized.getTypeArgs();
return typeArgs[0];
}
throw new UnableToCompleteException();
}
@Override
public String generate( TreeLogger logger, GeneratorContext context, String typeName ) throws UnableToCompleteException
{
this.logger = logger;
this.context = context;
this.askedTypeName = typeName;
// get the "reflection" machine of GWT compiler
TypeOracle typeOracle = context.getTypeOracle();
try
{
reflectedType = getReflectedType( typeOracle, typeName );
ClazzInfoBuilder builder = new ClazzInfoBuilder( logger, context );
return builder.buildClassInfoFor(reflectedType);
}
catch( Exception e )
{
// record to logger that Map generation threw an exception
logger.log( TreeLogger.ERROR, "ERROR when generating " + generatedClassName + " for " + typeName, e );
return null;
}
}
}