/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.ir.nodes;
import gw.internal.gosu.ir.transform.util.AccessibilityUtil;
import gw.internal.gosu.ir.transform.util.IRTypeResolver;
import gw.internal.gosu.parser.*;
import gw.lang.ir.IRType;
import gw.lang.parser.IDynamicPropertySymbol;
import gw.lang.parser.IReducedDynamicPropertySymbol;
import gw.lang.reflect.IRelativeTypeInfo;
import gw.lang.reflect.IType;
public class IRPropertyFromReducedDynamicPropertySymbol implements IRProperty {
private ReducedDynamicPropertySymbol _rdps;
public IRPropertyFromReducedDynamicPropertySymbol(ReducedDynamicPropertySymbol rdps) {
_rdps = rdps;
}
public ReducedDynamicPropertySymbol getDps() {
return _rdps;
}
@Override
public IRType getType() {
return IRTypeResolver.getDescriptor( getBoundedPropertyType(_rdps) );
}
@Override
public String getName() {
return _rdps.getName();
}
@Override
public boolean isField() {
return false;
}
@Override
public boolean isCaptured() {
return false;
}
@Override
public IRMethod getGetterMethod() {
return new IRMethodForReducedDPSGetter( this );
}
@Override
public IRMethod getSetterMethod() {
return new IRMethodForReducedDPSSetter( this );
}
@Override
public IRType getOwningIRType() {
return IRTypeResolver.getDescriptor( _rdps.getGosuClass() );
}
@Override
public IType getOwningIType() {
return _rdps.getGosuClass();
}
@Override
public IRelativeTypeInfo.Accessibility getAccessibility() {
return AccessibilityUtil.forSymbol(_rdps);
}
@Override
public boolean isStatic() {
return _rdps.isStatic();
}
@Override
public IRType getTargetRootIRType() {
return getOwningIRType();
}
@Override
public boolean isBytecodeProperty() {
return true;
}
public IType getBoundedPropertyType( IDynamicPropertySymbol dps )
{
while( dps instanceof ParameterizedDynamicPropertySymbol)
{
ParameterizedDynamicPropertySymbol pdfs = (ParameterizedDynamicPropertySymbol)dps;
dps = pdfs.getDelegate();
}
return TypeLord.getDefaultParameterizedTypeWithTypeVars( dps.getType() );
}
public IType getBoundedPropertyType( IReducedDynamicPropertySymbol rdps )
{
while( rdps instanceof ReducedParameterizedDynamicPropertySymbol)
{
ReducedParameterizedDynamicPropertySymbol pdfs = (ReducedParameterizedDynamicPropertySymbol)rdps;
rdps = pdfs.getDelegate();
}
return TypeLord.getDefaultParameterizedTypeWithTypeVars( rdps.getType() );
}
}