Browse Source

Converted CLIMarshal.cs to the new text generator class.

pull/1/head
triton 13 years ago
parent
commit
47012db6be
  1. 69
      src/Generator/Generators/CLI/CLIMarshal.cs

69
src/Generator/Generators/CLI/CLIMarshal.cs

@ -9,8 +9,8 @@ namespace Cxxi.Generators.CLI
public class CLIMarshalNativeToManagedPrinter : ITypeVisitor<bool>, public class CLIMarshalNativeToManagedPrinter : ITypeVisitor<bool>,
IDeclVisitor<bool> IDeclVisitor<bool>
{ {
public string Support = null; public TextGenerator Support;
public string Return = null; public TextGenerator Return;
Generator Generator { get; set; } Generator Generator { get; set; }
MarshalContext Context { get; set; } MarshalContext Context { get; set; }
@ -19,6 +19,8 @@ namespace Cxxi.Generators.CLI
{ {
Generator = gen; Generator = gen;
Context = ctx; Context = ctx;
Support = new TextGenerator();
Return = new TextGenerator();
} }
public bool VisitTagType(TagType tag, TypeQualifiers quals) public bool VisitTagType(TagType tag, TypeQualifiers quals)
@ -44,20 +46,20 @@ namespace Cxxi.Generators.CLI
if (pointee.IsPrimitiveType(PrimitiveType.Void)) if (pointee.IsPrimitiveType(PrimitiveType.Void))
{ {
Return = "IntPtr()"; Return.Write("IntPtr()");
return true; return true;
} }
if (pointee.IsPrimitiveType(PrimitiveType.Char)) if (pointee.IsPrimitiveType(PrimitiveType.Char))
{ {
Return = string.Format("clix::marshalString<clix::E_UTF8>({0})", Return.Write("clix::marshalString<clix::E_UTF8>({0})",
Context.ReturnVarName); Context.ReturnVarName);
return true; return true;
} }
PrimitiveType primitive; PrimitiveType primitive;
if (pointee.IsPrimitiveType(out primitive, walkTypedefs: true)) if (pointee.IsPrimitiveType(out primitive, walkTypedefs: true))
Return += "*"; Return.Write("*");
if (!pointee.Visit(this, quals)) if (!pointee.Visit(this, quals))
return false; return false;
@ -93,7 +95,7 @@ namespace Cxxi.Generators.CLI
case PrimitiveType.UInt64: case PrimitiveType.UInt64:
case PrimitiveType.Float: case PrimitiveType.Float:
case PrimitiveType.Double: case PrimitiveType.Double:
Return += Context.ReturnVarName; Return.Write(Context.ReturnVarName);
return true; return true;
case PrimitiveType.WideChar: case PrimitiveType.WideChar:
return false; return false;
@ -109,7 +111,7 @@ namespace Cxxi.Generators.CLI
TypeMap typeMap = null; TypeMap typeMap = null;
if (Generator.TypeMapDatabase.FindTypeMap(decl, out typeMap)) if (Generator.TypeMapDatabase.FindTypeMap(decl, out typeMap))
{ {
Return = typeMap.MarshalFromNative(Context); Return.Write(typeMap.MarshalFromNative(Context));
return typeMap.IsValueType; return typeMap.IsValueType;
} }
@ -137,17 +139,17 @@ namespace Cxxi.Generators.CLI
public bool VisitClassDecl(Class @class) public bool VisitClassDecl(Class @class)
{ {
if (@class.IsRefType) if (@class.IsRefType)
Return = "gcnew "; Return.Write("gcnew ");
Return += string.Format("{0}::{1}(", Generator.Library.Name, Return.Write("{0}::{1}(", Generator.Library.Name,
@class.Name); @class.Name);
Return += string.Format("(::{0}*)", @class.QualifiedOriginalName); Return.Write("(::{0}*)", @class.QualifiedOriginalName);
if (@class.IsValueType && !this.Context.ReturnType.IsPointer()) if (@class.IsValueType && !this.Context.ReturnType.IsPointer())
Return += "&"; Return.Write("&");
Return += string.Format("{0})", this.Context.ReturnVarName); Return.Write("{0})", this.Context.ReturnVarName);
return true; return true;
} }
@ -178,7 +180,7 @@ namespace Cxxi.Generators.CLI
public bool VisitEnumDecl(Enumeration @enum) public bool VisitEnumDecl(Enumeration @enum)
{ {
Return = string.Format("({0}){1}", ToCLITypeName(@enum), Return.Write("({0}){1}", ToCLITypeName(@enum),
Context.ReturnVarName); Context.ReturnVarName);
return true; return true;
} }
@ -218,8 +220,8 @@ namespace Cxxi.Generators.CLI
public class CLIMarshalManagedToNativePrinter : ITypeVisitor<bool>, public class CLIMarshalManagedToNativePrinter : ITypeVisitor<bool>,
IDeclVisitor<bool> IDeclVisitor<bool>
{ {
public string Support = null; public TextGenerator Support;
public string Return = null; public TextGenerator Return;
Generator Generator { get; set; } Generator Generator { get; set; }
MarshalContext Context { get; set; } MarshalContext Context { get; set; }
@ -228,6 +230,9 @@ namespace Cxxi.Generators.CLI
{ {
Generator = gen; Generator = gen;
Context = ctx; Context = ctx;
Support = new TextGenerator();
Return = new TextGenerator();
} }
public bool VisitTagType(TagType tag, TypeQualifiers quals) public bool VisitTagType(TagType tag, TypeQualifiers quals)
@ -261,7 +266,7 @@ namespace Cxxi.Generators.CLI
sb.Append("System::Runtime::InteropServices::Marshal::"); sb.Append("System::Runtime::InteropServices::Marshal::");
sb.Append("GetFunctionPointerForDelegate("); sb.Append("GetFunctionPointerForDelegate(");
sb.AppendFormat("{0}).ToPointer())", Context.Parameter.Name); sb.AppendFormat("{0}).ToPointer())", Context.Parameter.Name);
Return = sb.ToString(); Return.Write(sb.ToString());
return true; return true;
} }
@ -279,18 +284,18 @@ namespace Cxxi.Generators.CLI
if (isVoidPtr || isUInt8Ptr) if (isVoidPtr || isUInt8Ptr)
{ {
if (isUInt8Ptr) if (isUInt8Ptr)
Return += string.Format("({0})", "uint8*"); Return.Write("({0})", "uint8*");
Return += string.Format("{0}.ToPointer()", Context.Parameter.Name); Return.Write("{0}.ToPointer()", Context.Parameter.Name);
return true; return true;
} }
if (pointee.IsPrimitiveType(PrimitiveType.Char)) if (pointee.IsPrimitiveType(PrimitiveType.Char))
{ {
Support = string.Format( Support.Write(
"auto _{0} = clix::marshalString<clix::E_UTF8>({1});", "auto _{0} = clix::marshalString<clix::E_UTF8>({1});",
Context.ArgName, Context.Parameter.Name); Context.ArgName, Context.Parameter.Name);
Return = string.Format("_{0}.c_str()", Context.ArgName); Return.Write("_{0}.c_str()", Context.ArgName);
return true; return true;
} }
@ -332,7 +337,7 @@ namespace Cxxi.Generators.CLI
case PrimitiveType.UInt64: case PrimitiveType.UInt64:
case PrimitiveType.Float: case PrimitiveType.Float:
case PrimitiveType.Double: case PrimitiveType.Double:
Return += Context.Parameter.Name; Return.Write(Context.Parameter.Name);
return true; return true;
case PrimitiveType.WideChar: case PrimitiveType.WideChar:
return false; return false;
@ -348,7 +353,7 @@ namespace Cxxi.Generators.CLI
TypeMap typeMap = null; TypeMap typeMap = null;
if (Generator.TypeMapDatabase.FindTypeMap(decl, out typeMap)) if (Generator.TypeMapDatabase.FindTypeMap(decl, out typeMap))
{ {
Return = typeMap.MarshalToNative(Context); Return.Write(typeMap.MarshalToNative(Context));
return typeMap.IsValueType; return typeMap.IsValueType;
} }
@ -362,7 +367,7 @@ namespace Cxxi.Generators.CLI
PrimitiveType primitive; PrimitiveType primitive;
if (decl.Type.IsPrimitiveType(out primitive, walkTypedefs: true)) if (decl.Type.IsPrimitiveType(out primitive, walkTypedefs: true))
{ {
Return += string.Format("({0})", typedef.Declaration.Name); Return.Write("({0})", typedef.Declaration.Name);
} }
return decl.Type.Visit(this); return decl.Type.Visit(this);
@ -391,26 +396,26 @@ namespace Cxxi.Generators.CLI
if (Context.Parameter.Type.IsReference()) if (Context.Parameter.Type.IsReference())
{ {
var argName = string.Format("_{0}", Context.ArgName); var argName = string.Format("_{0}", Context.ArgName);
Support = string.Format("auto {0} = (::{1}*)&{2};", Support.Write("auto {0} = (::{1}*)&{2};",
argName, @class.OriginalName, argName, @class.OriginalName,
Context.Parameter.Name); Context.Parameter.Name);
Return = string.Format("*{0}", argName); Return.Write("*{0}", argName);
} }
else else
{ {
if (!Context.Parameter.Type.IsPointer()) //if (!Context.Parameter.Type.IsPointer())
Return = "*"; // Return = "*";
Return.Write("::{0}()", @class.QualifiedOriginalName);
Return += string.Format("(::{0}*)&{1}", @class.QualifiedOriginalName,
Context.Parameter.Name);
} }
} }
else else
{ {
if (!Context.Parameter.Type.IsPointer()) if (!Context.Parameter.Type.IsPointer())
Return = "*"; Return.Write("*");
Return += string.Format("{0}->NativePtr", Context.Parameter.Name); Return.Write("{0}->NativePtr", Context.Parameter.Name);
} }
return true; return true;
@ -443,7 +448,7 @@ namespace Cxxi.Generators.CLI
public bool VisitEnumDecl(Enumeration @enum) public bool VisitEnumDecl(Enumeration @enum)
{ {
Return = string.Format("(::{0}){1}", @enum.QualifiedOriginalName, Return.Write("(::{0}){1}", @enum.QualifiedOriginalName,
Context.Parameter.Name); Context.Parameter.Name);
return true; return true;
} }

Loading…
Cancel
Save