diff --git a/src/Generator/Generators/CLI/CLISourcesTemplate.cs b/src/Generator/Generators/CLI/CLISourcesTemplate.cs index 84e8c1f1..892d4a4f 100644 --- a/src/Generator/Generators/CLI/CLISourcesTemplate.cs +++ b/src/Generator/Generators/CLI/CLISourcesTemplate.cs @@ -230,7 +230,7 @@ namespace Cxxi.Generators.CLI var returns = new List(); foreach (var param in @params) { - var ctx = new MarshalContext() + var ctx = new MarshalContext(Driver) { ReturnVarName = param.Name, ReturnType = param.Type @@ -294,7 +294,7 @@ namespace Cxxi.Generators.CLI var nativeField = string.Format("{0}->{1}", nativePointer, field.OriginalName); - var ctx = new MarshalContext() + var ctx = new MarshalContext(Driver) { ReturnVarName = nativeField, ReturnType = field.Type @@ -446,7 +446,7 @@ namespace Cxxi.Generators.CLI { Write("return "); - var ctx = new MarshalContext() + var ctx = new MarshalContext(Driver) { ReturnVarName = "ret", ReturnType = retType @@ -501,7 +501,7 @@ namespace Cxxi.Generators.CLI var argName = "arg" + paramIndex.ToString(CultureInfo.InvariantCulture); - var ctx = new MarshalContext() + var ctx = new MarshalContext(Driver) { Parameter = param, ParameterIndex = paramIndex, diff --git a/src/Generator/Generators/CLI/CLITypePrinter.cs b/src/Generator/Generators/CLI/CLITypePrinter.cs index 5d78b64e..ea1f79c4 100644 --- a/src/Generator/Generators/CLI/CLITypePrinter.cs +++ b/src/Generator/Generators/CLI/CLITypePrinter.cs @@ -145,7 +145,7 @@ namespace Cxxi.Generators.CLI TypeMap typeMap = null; if (TypeMapDatabase.FindTypeMap(decl, out typeMap)) { - return typeMap.Signature(); + return typeMap.CLISignature(); } FunctionType func; @@ -168,7 +168,7 @@ namespace Cxxi.Generators.CLI { typeMap.Declaration = decl; typeMap.Type = template; - return typeMap.Signature(); + return typeMap.CLISignature(); } return decl.Name; diff --git a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs index e8494095..bee811ef 100644 --- a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs +++ b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs @@ -95,7 +95,7 @@ namespace Cxxi.Generators.CSharp TypeMap typeMap = null; if (TypeMapDatabase.FindTypeMap(decl, out typeMap)) { - return typeMap.Signature(); + return typeMap.CSharpSignature(); } FunctionType func; diff --git a/src/Generator/Types/Std/Stdlib.cs b/src/Generator/Types/Std/Stdlib.cs index 27ffe1a5..259a2159 100644 --- a/src/Generator/Types/Std/Stdlib.cs +++ b/src/Generator/Types/Std/Stdlib.cs @@ -12,38 +12,38 @@ namespace Cxxi.Types.Std [TypeMap("std::string")] public class String : TypeMap { - public override string Signature() + public override string CLISignature() { return "System::String^"; } - public override string MarshalToNative(MarshalContext ctx) + public override void CLIMarshalToNative(MarshalContext ctx) { - return string.Format("marshalString({0})", ctx.Parameter.Name); + ctx.Return.Write("marshalString({0})", ctx.Parameter.Name); } - public override string MarshalFromNative(MarshalContext ctx) + public override void CLIMarshalToManaged(MarshalContext ctx) { - return string.Format("marshalString({0})", ctx.ReturnVarName); + ctx.Return.Write("marshalString({0})", ctx.ReturnVarName); } } [TypeMap("std::wstring")] public class WString : TypeMap { - public override string Signature() + public override string CLISignature() { return "System::String^"; } - public override string MarshalToNative(MarshalContext ctx) + public override void CLIMarshalToNative(MarshalContext ctx) { - return string.Format("marshalString({0})", ctx.Parameter.Name); + ctx.Return.Write("marshalString({0})", ctx.Parameter.Name); } - public override string MarshalFromNative(MarshalContext ctx) + public override void CLIMarshalToManaged(MarshalContext ctx) { - return string.Format("marshalString({0})", ctx.ReturnVarName); + ctx.Return.Write("marshalString({0})", ctx.ReturnVarName); } } @@ -52,19 +52,19 @@ namespace Cxxi.Types.Std { public override bool IsIgnored { get { return true; } } - public override string Signature() + public override string CLISignature() { var type = Type as TemplateSpecializationType; var typeName = type.Arguments[0].Type.ToString(); return string.Format("System::Collections::Generic::List<{0}>^", typeName); } - public override string MarshalToNative(MarshalContext ctx) + public override void CLIMarshalToNative(MarshalContext ctx) { throw new System.NotImplementedException(); } - public override string MarshalFromNative(MarshalContext ctx) + public override void CLIMarshalToManaged(MarshalContext ctx) { throw new System.NotImplementedException(); } @@ -75,7 +75,7 @@ namespace Cxxi.Types.Std { public override bool IsIgnored { get { return true; } } - public override string Signature() + public override string CLISignature() { var type = Type as TemplateSpecializationType; return string.Format("System::Collections::Generic::Dictionary<{0}, {1}>^", @@ -83,12 +83,12 @@ namespace Cxxi.Types.Std type.Arguments[1].Type); } - public override string MarshalToNative(MarshalContext ctx) + public override void CLIMarshalToNative(MarshalContext ctx) { throw new System.NotImplementedException(); } - public override string MarshalFromNative(MarshalContext ctx) + public override void CLIMarshalToManaged(MarshalContext ctx) { throw new System.NotImplementedException(); } @@ -103,17 +103,17 @@ namespace Cxxi.Types.Std [TypeMap("std::shared_ptr")] public class SharedPtr : TypeMap { - public override string Signature() + public override string CLISignature() { throw new System.NotImplementedException(); } - public override string MarshalToNative(MarshalContext ctx) + public override void CLIMarshalToNative(MarshalContext ctx) { throw new System.NotImplementedException(); } - public override string MarshalFromNative(MarshalContext ctx) + public override void CLIMarshalToManaged(MarshalContext ctx) { throw new System.NotImplementedException(); } diff --git a/src/Generator/Types/TypeMap.cs b/src/Generator/Types/TypeMap.cs index 36d36c54..913b15e7 100644 --- a/src/Generator/Types/TypeMap.cs +++ b/src/Generator/Types/TypeMap.cs @@ -1,14 +1,27 @@ using System; using System.Collections.Generic; using System.Reflection; +using Cxxi.Generators.CLI; namespace Cxxi.Types { public class MarshalContext { - public string ArgName { get; set; } + public MarshalContext(Driver driver) + { + + } + + public Driver Driver { get; set; } + + public CLIMarshalNativeToManagedPrinter MarshalToManaged; + public CLIMarshalManagedToNativePrinter MarshalToNative; + + public TextGenerator Return; public string ReturnVarName { get; set; } public Type ReturnType { get; set; } + + public string ArgName { get; set; } public Parameter Parameter { get; set; } public int ParameterIndex { get; set; } public Function Function { get; set; } @@ -45,26 +58,49 @@ namespace Cxxi.Types get { return false; } } - public virtual string Signature() + #region C# backend + + public virtual string CSharpSignature() + { + throw new NotImplementedException(); + } + + public virtual void CSharpMarshalToNative(MarshalContext ctx) { throw new NotImplementedException(); } - public virtual string MarshalToNative(MarshalContext ctx) + public virtual void CSharpMarshalToManaged(MarshalContext ctx) { throw new NotImplementedException(); } - public virtual string MarshalFromNative(MarshalContext ctx) + #endregion + + #region C++/CLI backend + + public virtual string CLISignature() { throw new NotImplementedException(); } + + public virtual void CLIMarshalToNative(MarshalContext ctx) + { + throw new NotImplementedException(); + } + + public virtual void CLIMarshalToManaged(MarshalContext ctx) + { + throw new NotImplementedException(); + } + + #endregion } public interface ITypeMapDatabase { - bool FindTypeMap(Declaration decl, out TypeMap typeMap); bool FindTypeMap(Type type, out TypeMap typeMap); + bool FindTypeMap(Declaration decl, out TypeMap typeMap); bool FindTypeMap(string name, out TypeMap typeMap); }