/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.parser;
import gw.lang.parser.IReducedDynamicPropertySymbol;
import gw.lang.parser.TypeVarToTypeMap;
import gw.lang.reflect.IType;
import gw.lang.parser.ScriptPartId;
/**
*/
public class ParameterizedDynamicPropertySymbol extends DynamicPropertySymbol
{
private DynamicPropertySymbol _delegate;
public ParameterizedDynamicPropertySymbol( DynamicPropertySymbol dpsDelegate, IGosuClassInternal owner )
{
super( dpsDelegate );
_delegate = dpsDelegate;
setModifierInfo( _delegate.getModifierInfo() );
assignPossibleParametarizedGetterAndSetter( owner );
setType( getActualType( dpsDelegate.getType(), owner ) );
setScriptPart( new ScriptPartId( owner, null ) );
}
public DynamicPropertySymbol getDelegate()
{
return _delegate;
}
private void assignPossibleParametarizedGetterAndSetter( IGosuClassInternal owner )
{
if( owner == null || !owner.isParameterizedType() )
{
return;
}
if( _dfsGetter != null && _dfsGetter.getGosuClass() != owner )
{
_dfsGetter = _dfsGetter.getParameterizedVersion( owner );
}
if( _dfsSetter != null && _dfsSetter.getGosuClass() != owner )
{
_dfsSetter = _dfsSetter.getParameterizedVersion( owner );
}
}
private IType getActualType( IType propType, IGosuClassInternal ownerType )
{
if( ownerType.isParameterizedType() )
{
TypeVarToTypeMap actualParamByVarName = TypeLord.mapTypeByVarName( ownerType, ownerType, true );
propType = TypeLord.getActualType( propType, actualParamByVarName, true );
}
return propType;
}
@Override
public IReducedDynamicPropertySymbol createReducedSymbol() {
return new ReducedParameterizedDynamicPropertySymbol(
(ReducedDynamicPropertySymbol) getDelegate().createReducedSymbol(), this);
}
}