package sharpen.xobotos.api.interop.marshal;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import org.eclipse.jdt.core.dom.ITypeBinding;
import sharpen.core.csharp.ast.CSCastExpression;
import sharpen.core.csharp.ast.CSExpression;
import sharpen.core.csharp.ast.CSTypeReference;
import sharpen.core.csharp.ast.CSTypeReferenceExpression;
import sharpen.xobotos.api.interop.Signature.Flags;
import sharpen.xobotos.api.interop.Signature.Mode;
import sharpen.xobotos.api.interop.glue.AbstractTypeReference;
import sharpen.xobotos.api.interop.glue.CastExpression;
import sharpen.xobotos.api.interop.glue.Expression;
import sharpen.xobotos.api.interop.glue.TypeReference;
import sharpen.xobotos.config.ConfigurationException;
public class MarshalAsEnum extends MarshalInfo {
@XStreamAlias("native-enum")
public static class Entry extends MarshalEntry {
@XStreamAlias("managed-type")
private String _managedType;
@XStreamAlias("native-type")
private String _nativeType;
@Override
protected Object readResolve() {
if (_nativeType == null)
throw new ConfigurationException("Missing <native-type> in MarshalAsEnum");
return super.readResolve();
}
@Override
public MarshalInfo resolve(ITypeBinding type) {
if (!type.isEnum() && (!type.isPrimitive() || !type.getName().equals("int")))
return null;
return new MarshalAsEnum(type, _managedType, _nativeType);
}
}
private final String _managedType;
private final String _nativeType;
protected MarshalAsEnum(ITypeBinding type, String managedType, String nativeType) {
super(type);
this._managedType = managedType;
this._nativeType = nativeType;
}
@Override
public boolean isPrimitiveType() {
return true;
}
@Override
public CSTypeReferenceExpression getManagedType(Mode mode, Flags flags) {
return new CSTypeReference("int");
}
@Override
public CSTypeReferenceExpression getPInvokeType(Mode mode, Flags flags) {
return new CSTypeReference("int");
}
@Override
public AbstractTypeReference getNativeType(Mode mode, Flags flags) {
return new TypeReference("int");
}
@Override
public CSExpression marshalIn(CSExpression expr, Mode mode, Flags flags) {
if (_managedType != null)
return new CSCastExpression(getPInvokeType(mode, flags), expr);
else
return expr;
}
@Override
public Expression marshalNativeArg(Expression expr, Mode mode, Flags flags) {
final TypeReference enumType = new TypeReference(_nativeType);
return new CastExpression(enumType, expr);
}
}