/* * 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.reflect.IAnnotationInfo; import gw.lang.reflect.java.IJavaClassField; 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.AsmField; import gw.lang.reflect.module.IModule; import java.lang.annotation.Annotation; import java.util.List; public class AsmFieldJavaClassField implements IJavaClassField { private AsmField _field; private IModule _module; public AsmFieldJavaClassField( AsmField field, IModule module ) { _field = field; _module = module; } @Override public boolean isSynthetic() { return _field.isSynthetic(); } @Override public int getModifiers() { return _field.getModifiers(); } @Override public String getName() { return _field.getName(); } @Override public IJavaClassInfo getType() { return JavaSourceUtil.getClassInfo( _field.getType().getRawType().getNameWithArrayBrackets(), _module ); } @Override public IJavaClassType getGenericType() { IJavaClassType type = AsmTypeJavaClassType.createType( _field.getType(), _module ); if( type == null ) { throw new IllegalStateException( "Unable to create a generic type for the field " + _field.getName() + " on " + _field.getDeclaringClass().getName() + " in module " + _module.getName() + "\n" + "Type : " + _field.getType() + ", Type.class " + _field.getType().getClass().getName() + " GenericType : " + _field.getType() + ", GenericType.class : " + _field.getType().getClass().getName() ); } return type; } @Override public IJavaClassInfo getEnclosingClass() { return JavaSourceUtil.getClassInfo( _field.getDeclaringClass(), _module ); } @Override public boolean isEnumConstant() { return _field.isEnumConstant(); } @Override public boolean isAnnotationPresent( Class<? extends Annotation> annotationClass ) { return _field.isAnnotationPresent( annotationClass ); } @Override public IAnnotationInfo getAnnotation( Class annotationClass ) { AsmAnnotation annotation = _field.getAnnotation( annotationClass ); return annotation != null ? new AsmClassAnnotationInfo( annotation, this ) : null; } @Override public IAnnotationInfo[] getDeclaredAnnotations() { List<AsmAnnotation> annotations = _field.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; } public String toString() { return _field.toString(); } public Object getStaticValue( ) { return _field.getStaticValue(); } }