/*
* Copyright 2013. Guidewire Software, Inc.
*/
package gw.lang.reflect.java.asm;
import gw.internal.ext.org.objectweb.asm.signature.SignatureVisitor;
/**
*/
public class FieldSignatureVisitor implements SignatureVisitor {
private AsmField _asmField;
private AsmType _currentType;
private AsmType _typeArg;
private boolean _bArray;
private Boolean _variance; // null = none, true = covariant, false = contravariant
FieldSignatureVisitor( AsmField field ) {
_asmField = field;
}
FieldSignatureVisitor( AsmField field, AsmType type ) {
_asmField = field;
_currentType = type;
}
FieldSignatureVisitor( AsmField field, AsmType type, char wildcardVariance ) {
_asmField = field;
_currentType = type;
_variance = wildcardVariance == '+';
}
@Override
public void visitFormalTypeParameter( String tv ) {
throw new IllegalStateException();
}
@Override
public SignatureVisitor visitClassBound() {
throw new IllegalStateException();
}
@Override
public SignatureVisitor visitInterfaceBound() {
throw new IllegalStateException();
}
@Override
public SignatureVisitor visitSuperclass() {
return this;
}
@Override
public SignatureVisitor visitInterface() {
throw new IllegalStateException();
}
@Override
public SignatureVisitor visitParameterType() {
// For method only
throw new IllegalStateException();
}
@Override
public SignatureVisitor visitReturnType() {
// For method only
throw new IllegalStateException();
}
@Override
public SignatureVisitor visitExceptionType() {
// For method only
throw new IllegalStateException();
}
@Override
public void visitBaseType( char c ) {
}
@Override
public void visitTypeVariable( String tv ) {
if( _currentType == null ) {
_currentType = AsmUtil.makeTypeVariable( tv );
if( _variance != null ) {
_currentType = new AsmWildcardType( _currentType, _variance );
}
_asmField.setType( _currentType );
}
else {
_typeArg = AsmUtil.makeTypeVariable( tv );
if( _variance != null ) {
_typeArg = new AsmWildcardType( _typeArg, _variance );
}
_currentType.addTypeParameter( _typeArg );
}
}
@Override
public SignatureVisitor visitArrayType() {
FieldSignatureVisitor visitor = new FieldSignatureVisitor( _asmField, _currentType );
visitor._typeArg = _typeArg;
visitor._bArray = true;
return visitor;
}
@Override
public void visitClassType( String name ) {
if( _currentType == null ) {
_currentType = AsmUtil.makeType( name );
if( _variance != null ) {
_currentType = new AsmWildcardType( _currentType, _variance );
}
_asmField.setType( _currentType );
}
else {
_typeArg = AsmUtil.makeType( name );
if( _variance != null ) {
_typeArg = new AsmWildcardType( _typeArg, _variance );
}
_currentType.addTypeParameter( _typeArg );
}
}
@Override
public void visitInnerClassType( String name ) {
if( _currentType == null ) {
_currentType = AsmUtil.makeType( name );
if( _variance != null ) {
_currentType = new AsmWildcardType( _currentType, _variance );
}
_asmField.setType( _currentType );
}
else {
_typeArg = AsmUtil.makeType( name );
if( _variance != null ) {
_typeArg = new AsmWildcardType( _typeArg, _variance );
}
_currentType.addTypeParameter( _typeArg );
}
}
@Override
public void visitTypeArgument() {
_currentType.addTypeParameter( new AsmWildcardType( null, true ) );
}
@Override
public SignatureVisitor visitTypeArgument( char wildcard ) {
if( wildcard != '=' ) {
return new FieldSignatureVisitor( _asmField, _typeArg == null ? _currentType : _typeArg, wildcard );
}
return new FieldSignatureVisitor( _asmField, _typeArg == null ? _currentType : _typeArg );
}
@Override
public void visitEnd() {
if( _bArray ) {
_currentType.incArrayDims();
}
}
}