/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.parser;
import gw.internal.gosu.parser.java.classinfo.JavaSourceUtil;
import gw.lang.parser.TypeVarToTypeMap;
import gw.lang.reflect.IAnnotationInfo;
import gw.lang.reflect.java.*;
import gw.lang.reflect.IParameterInfo;
import gw.lang.reflect.IFeatureInfo;
import gw.lang.reflect.module.IModule;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Type;
import java.lang.annotation.Annotation;
public class ConstructorJavaClassConstructor implements IJavaClassConstructor, IJavaClassBytecodeConstructor {
private Constructor _ctor;
private IModule _module;
public ConstructorJavaClassConstructor(Constructor ctor, IModule module) {
_ctor = ctor;
_module = module;
}
public void setAccessible(boolean accessible) {
_ctor.setAccessible(accessible);
}
public Class getDeclaringJavaClass() {
return _ctor.getDeclaringClass();
}
@Override
public IJavaClassInfo[] getExceptionTypes() {
Class[] rawTypes = _ctor.getExceptionTypes();
IJavaClassInfo[] types = new IJavaClassInfo[rawTypes.length];
for (int i = 0; i < rawTypes.length; i++) {
types[i] = JavaSourceUtil.getClassInfo(rawTypes[i], _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() {
Type[] rawTypes = _ctor.getGenericParameterTypes();
IJavaClassType[] types = new IJavaClassType[rawTypes.length];
for (int i = 0; i < rawTypes.length; i++) {
types[i] = TypeJavaClassType.createType(rawTypes[i], _module);
}
return types;
}
@Override
public IJavaClassInfo[] getParameterTypes() {
Class[] rawParamTypes = getJavaParameterTypes();
IJavaClassInfo[] paramTypes = new IJavaClassInfo[rawParamTypes.length];
for (int i = 0; i < rawParamTypes.length; i++) {
paramTypes[i] = JavaSourceUtil.getClassInfo(rawParamTypes[i], _module);
}
return paramTypes;
}
public Class[] getJavaParameterTypes() {
return _ctor.getParameterTypes();
}
public Object newInstance(Object[] objects) throws InvocationTargetException, IllegalAccessException, InstantiationException {
return _ctor.newInstance(objects);
}
@Override
public boolean isDefault() {
return false;
}
@Override
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
return _ctor.isAnnotationPresent(annotationClass);
}
@Override
public IAnnotationInfo getAnnotation(Class annotationClass) {
Annotation annotation = _ctor.getAnnotation(annotationClass);
return annotation != null ? new ClassAnnotationInfo(annotation, this) : null;
}
@Override
public IAnnotationInfo[] getDeclaredAnnotations() {
Annotation[] annotations = _ctor.getDeclaredAnnotations();
IAnnotationInfo[] declaredAnnotations = new IAnnotationInfo[annotations.length];
for (int i = 0; i < declaredAnnotations.length; i++) {
declaredAnnotations[i] = new ClassAnnotationInfo(annotations[i], this);
}
return declaredAnnotations;
}
public Constructor getJavaConstructor() {
return _ctor;
}
@Override
public IJavaClassInfo getEnclosingClass() {
return JavaSourceUtil.getClassInfo(_ctor.getDeclaringClass(), _module);
}
}