/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.ir.nodes;
import gw.internal.gosu.ir.transform.util.IRTypeResolver;
import gw.internal.gosu.ir.transform.util.NameResolver;
import gw.lang.ir.IRType;
import gw.lang.ir.IRTypeConstants;
import gw.lang.reflect.IFunctionType;
import gw.lang.reflect.IPropertyInfo;
import gw.lang.reflect.IRelativeTypeInfo;
import gw.lang.reflect.IType;
import gw.lang.reflect.gs.IGenericTypeVariable;
import gw.lang.reflect.gs.IGosuPropertyInfo;
import gw.lang.reflect.java.IJavaClassMethod;
import gw.lang.reflect.java.IJavaPropertyDescriptor;
import gw.lang.reflect.java.IJavaPropertyInfo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class IRMethodForPropertySetter extends IRFeatureBase implements IRMethod {
private IRPropertyFromPropertyInfo _owningProperty;
public IRMethodForPropertySetter(IRPropertyFromPropertyInfo owningProperty) {
_owningProperty = owningProperty;
}
@Override
public IRType getReturnType() {
IPropertyInfo pi = _owningProperty.getTerminalProperty();
if( pi instanceof IJavaPropertyInfo ) {
IJavaPropertyDescriptor propDesc = ((IJavaPropertyInfo)pi).getPropertyDescriptor();
if( propDesc != null ) {
IJavaClassMethod m = propDesc.getWriteMethod();
if( m != null ) {
// A setter is allowed to return the type of the property (e.g., to support builders)
return IRTypeResolver.getDescriptor( m.getReturnType() );
}
}
}
return IRTypeConstants.pVOID();
}
@Override
public List<IRType> getExplicitParameterTypes() {
return Collections.singletonList( _owningProperty.getType() );
}
@Override
public List<IRType> getAllParameterTypes() {
List<IRType> paramTypes = new ArrayList<IRType>();
addImplicitParameters(getOwningIType(), getFunctionType(), isStatic(), paramTypes);
paramTypes.add( _owningProperty.getType() );
return paramTypes;
}
@Override
public String getName() {
return NameResolver.getSetterName( _owningProperty.getTerminalProperty() );
}
@Override
public IRType getOwningIRType() {
return _owningProperty.getOwningIRType();
}
@Override
public IType getOwningIType() {
return _owningProperty.getOwningIType();
}
@Override
public IRelativeTypeInfo.Accessibility getAccessibility() {
return _owningProperty.getAccessibility();
}
@Override
public boolean isStatic() {
return _owningProperty.isStatic();
}
@Override
public IRType getTargetRootIRType() {
return _owningProperty.getTargetRootIRType();
}
@Override
public IGenericTypeVariable[] getTypeVariables() {
return null;
}
@Override
public IFunctionType getFunctionType() {
if (_owningProperty.getTerminalProperty() instanceof IGosuPropertyInfo) {
return (IFunctionType) ((IGosuPropertyInfo) _owningProperty.getTerminalProperty()).getDps().getSetterDfs().getType();
} else {
return null;
}
}
@Override
public boolean isBytecodeMethod() {
return _owningProperty.isBytecodeProperty();
}
@Override
public boolean couldHaveTypeVariables() {
return true;
}
@Override
public boolean isGeneratedEnumMethod()
{
return false;
}
}