/*
* Copyright 2013. Guidewire Software, Inc.
*/
package gw.internal.gosu.parser;
import gw.internal.gosu.parser.java.classinfo.AsmClassAnnotationInfo;
import gw.internal.gosu.parser.java.classinfo.JavaSourceUtil;
import gw.lang.parser.TypeVarToTypeMap;
import gw.lang.reflect.IAnnotationInfo;
import gw.lang.reflect.IFeatureInfo;
import gw.lang.reflect.IParameterInfo;
import gw.lang.reflect.java.IJavaClassBytecodeConstructor;
import gw.lang.reflect.java.IJavaClassConstructor;
import gw.lang.reflect.java.IJavaClassInfo;
import gw.lang.reflect.java.IJavaClassType;
import gw.lang.reflect.java.asm.AsmAnnotation;
import gw.lang.reflect.java.asm.AsmMethod;
import gw.lang.reflect.java.asm.AsmType;
import gw.lang.reflect.module.IModule;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
public class AsmConstructorJavaClassConstructor implements IJavaClassConstructor, IJavaClassBytecodeConstructor {
private AsmMethod _ctor;
private IModule _module;
public AsmConstructorJavaClassConstructor( AsmMethod ctor, IModule module ) {
_ctor = ctor;
_module = module;
}
@Override
public IJavaClassInfo[] getExceptionTypes() {
List<AsmType> rawTypes = _ctor.getExceptions();
IJavaClassInfo[] types = new IJavaClassInfo[rawTypes.size()];
for( int i = 0; i < rawTypes.size(); i++ ) {
types[i] = JavaSourceUtil.getClassInfo( rawTypes.get( i ).getRawType().getName(), _module );
}
return types;
}
@Override
public int getModifiers() {
return _ctor.getModifiers();
}
@Override
public boolean isSynthetic() {
return _ctor.isSynthetic();
}
@Override
public IParameterInfo[] convertGenericParameterTypes( IFeatureInfo container, TypeVarToTypeMap actualParamByVarName, boolean bKeepTypeVars ) {
return JavaMethodInfo.convertGenericParameterTypes( container, actualParamByVarName, getGenericParameterTypes(), bKeepTypeVars, getEnclosingClass() );
}
private IJavaClassType[] getGenericParameterTypes() {
List<AsmType> rawTypes = _ctor.getGenericParameters();
IJavaClassType[] types = new IJavaClassType[rawTypes.size()];
for( int i = 0; i < rawTypes.size(); i++ ) {
types[i] = AsmTypeJavaClassType.createType( rawTypes.get( i ), _module );
}
return types;
}
@Override
public IJavaClassInfo[] getParameterTypes() {
List<AsmType> rawParamTypes = _ctor.getParameters();
IJavaClassInfo[] paramTypes = new IJavaClassInfo[rawParamTypes.size()];
for( int i = 0; i < rawParamTypes.size(); i++ ) {
paramTypes[i] = JavaSourceUtil.getClassInfo( rawParamTypes.get( i ).getRawType().getNameWithArrayBrackets(), _module );
}
return paramTypes;
}
public Object newInstance( Object[] objects ) throws InvocationTargetException, IllegalAccessException, InstantiationException {
throw new UnsupportedOperationException();
}
@Override
public boolean isDefault() {
return false;
}
@Override
public boolean isAnnotationPresent( Class<? extends Annotation> annotationClass ) {
return _ctor.isAnnotationPresent( annotationClass );
}
@Override
public IAnnotationInfo getAnnotation( Class annotationClass ) {
AsmAnnotation annotation = _ctor.getAnnotation( annotationClass );
return annotation != null ? new AsmClassAnnotationInfo( annotation, this ) : null;
}
@Override
public IAnnotationInfo[] getDeclaredAnnotations() {
List<AsmAnnotation> annotations = _ctor.getAnnotations();
IAnnotationInfo[] declaredAnnotations = new IAnnotationInfo[annotations.size()];
for( int i = 0; i < declaredAnnotations.length; i++ ) {
declaredAnnotations[i] = new AsmClassAnnotationInfo( annotations.get( i ), this );
}
return declaredAnnotations;
}
@Override
public IJavaClassInfo getEnclosingClass() {
return JavaSourceUtil.getClassInfo( _ctor.getDeclaringClass(), _module );
}
}