Browse Source

Added better wrapping for out parameters.

pull/1/head
triton 13 years ago
parent
commit
d531e40e5f
  1. 61
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs

61
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -1146,42 +1146,52 @@ namespace CppSharp.Generators.CSharp
if (param.Usage == ParameterUsage.Out) if (param.Usage == ParameterUsage.Out)
{ {
//var paramType = param.Type; var paramType = param.Type;
//if (paramType.IsReference())
// paramType = (paramType as PointerType).Pointee;
//var typePrinter = new CppTypePrinter(Driver.TypeDatabase); Class @class;
//var type = paramType.Visit(typePrinter); if (paramType.Desugar().IsTagDecl(out @class) && @class.IsRefType)
{
//WriteLine("{0} {1};", type, argName); WriteLine("{0} = new {1}();", param.Name, paramType);
}
} }
else
var ctx = new CSharpMarshalContext(Driver)
{ {
var ctx = new CSharpMarshalContext(Driver) Parameter = param,
{ ParameterIndex = paramIndex,
Parameter = param, ArgName = argName,
ParameterIndex = paramIndex, Function = function
ArgName = argName, };
Function = function
};
paramMarshal.Context = ctx; paramMarshal.Context = ctx;
var marshal = new CSharpMarshalManagedToNativePrinter(ctx); var marshal = new CSharpMarshalManagedToNativePrinter(ctx);
param.Visit(marshal); param.Visit(marshal);
if (string.IsNullOrEmpty(marshal.Context.Return)) if (string.IsNullOrEmpty(marshal.Context.Return))
throw new Exception("Cannot marshal argument of function"); throw new Exception("Cannot marshal argument of function");
if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore)) if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore))
Write(marshal.Context.SupportBefore); Write(marshal.Context.SupportBefore);
WriteLine("var {0} = {1};", SafeIdentifier(argName), marshal.Context.Return); WriteLine("var {0} = {1};", SafeIdentifier(argName), marshal.Context.Return);
}
return paramMarshal; return paramMarshal;
} }
static string GetParameterUsage(ParameterUsage usage)
{
switch (usage)
{
case ParameterUsage.Out:
return "out ";
case ParameterUsage.InOut:
return "ref";
default:
return string.Empty;
}
}
private void GenerateMethodParameters(Method method, Class @class) private void GenerateMethodParameters(Method method, Class @class)
{ {
var @params = new List<string>(); var @params = new List<string>();
@ -1193,7 +1203,8 @@ namespace CppSharp.Generators.CSharp
if (param.Kind == ParameterKind.HiddenStructureReturn) if (param.Kind == ParameterKind.HiddenStructureReturn)
continue; continue;
@params.Add(string.Format("{0} {1}", param.Type, SafeIdentifier(param.Name))); @params.Add(string.Format("{0}{1} {2}", GetParameterUsage(param.Usage),
param.Type, SafeIdentifier(param.Name)));
} }
Write(string.Join(", ", @params)); Write(string.Join(", ", @params));

Loading…
Cancel
Save