package sharpen.xobotos.api.interop.marshal;
import org.eclipse.jdt.core.dom.ITypeBinding;
import sharpen.core.csharp.ast.CSExpression;
import sharpen.core.csharp.ast.CSTypeReferenceExpression;
import sharpen.xobotos.api.AbstractReference;
import sharpen.xobotos.api.interop.*;
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.Expression;
import java.util.ArrayList;
import java.util.List;
public abstract class MarshalInfo implements IncludeFileProvider {
public abstract static class MarshalEntry extends AbstractReference {
protected Object readResolve() {
return this;
}
public abstract MarshalInfo resolve(ITypeBinding type);
}
private final ITypeBinding _type;
protected MarshalInfo(ITypeBinding type) {
this._type = type;
}
public ITypeBinding getType() {
return _type;
}
public abstract boolean isPrimitiveType();
public abstract AbstractTypeReference getNativeType(Mode mode, Flags flags);
public abstract CSTypeReferenceExpression getManagedType(Mode mode, Flags flags);
public CSTypeReferenceExpression getPInvokeType(Mode mode, Flags flags) {
return getManagedType(mode, flags);
}
public CSTypeReferenceExpression getPInvokeReturnType() {
return getPInvokeType(Mode.OUT, null);
}
@Override
public List<String> getIncludes() {
return new ArrayList<String>();
}
public CSExpression marshalIn(CSExpression expr, Mode mode, Flags flags) {
return expr;
}
public void marshal(IManagedMarshalContext context, CSExpression expr, Mode mode, Flags flags) {
final CSTypeReferenceExpression type = getPInvokeType(mode, flags);
CSExpression arg = marshalIn(expr, mode, flags);
context.addParameter(null, type, arg);
}
public CSExpression marshalRetval(IManagedReturnContext context, CSExpression expr) {
return expr;
}
public void marshalNative(INativeMarshalContext context, Mode mode, Flags flags) {
final AbstractTypeReference type = getNativeType(mode, flags);
final NativeVariable param = context.createParameter(null, type);
final Expression expr = marshalNativeArg(param.getReference(), mode, flags);
context.addArgument(expr);
}
public Expression marshalNativeArg(Expression expr, Mode mode, Flags flags) {
return expr;
}
public boolean resolve(IMarshalContext context, ITypeBinding type) {
return true;
}
}