Browse Source

Refactor the type map system to have per-generator overloads (to better support the C# backend).

pull/1/head
triton 13 years ago
parent
commit
e8f51728db
  1. 8
      src/Generator/Generators/CLI/CLISourcesTemplate.cs
  2. 4
      src/Generator/Generators/CLI/CLITypePrinter.cs
  3. 2
      src/Generator/Generators/CSharp/CSharpTypePrinter.cs
  4. 38
      src/Generator/Types/Std/Stdlib.cs
  5. 46
      src/Generator/Types/TypeMap.cs

8
src/Generator/Generators/CLI/CLISourcesTemplate.cs

@ -230,7 +230,7 @@ namespace Cxxi.Generators.CLI
var returns = new List<string>(); var returns = new List<string>();
foreach (var param in @params) foreach (var param in @params)
{ {
var ctx = new MarshalContext() var ctx = new MarshalContext(Driver)
{ {
ReturnVarName = param.Name, ReturnVarName = param.Name,
ReturnType = param.Type ReturnType = param.Type
@ -294,7 +294,7 @@ namespace Cxxi.Generators.CLI
var nativeField = string.Format("{0}->{1}", var nativeField = string.Format("{0}->{1}",
nativePointer, field.OriginalName); nativePointer, field.OriginalName);
var ctx = new MarshalContext() var ctx = new MarshalContext(Driver)
{ {
ReturnVarName = nativeField, ReturnVarName = nativeField,
ReturnType = field.Type ReturnType = field.Type
@ -446,7 +446,7 @@ namespace Cxxi.Generators.CLI
{ {
Write("return "); Write("return ");
var ctx = new MarshalContext() var ctx = new MarshalContext(Driver)
{ {
ReturnVarName = "ret", ReturnVarName = "ret",
ReturnType = retType ReturnType = retType
@ -501,7 +501,7 @@ namespace Cxxi.Generators.CLI
var argName = "arg" + paramIndex.ToString(CultureInfo.InvariantCulture); var argName = "arg" + paramIndex.ToString(CultureInfo.InvariantCulture);
var ctx = new MarshalContext() var ctx = new MarshalContext(Driver)
{ {
Parameter = param, Parameter = param,
ParameterIndex = paramIndex, ParameterIndex = paramIndex,

4
src/Generator/Generators/CLI/CLITypePrinter.cs

@ -145,7 +145,7 @@ namespace Cxxi.Generators.CLI
TypeMap typeMap = null; TypeMap typeMap = null;
if (TypeMapDatabase.FindTypeMap(decl, out typeMap)) if (TypeMapDatabase.FindTypeMap(decl, out typeMap))
{ {
return typeMap.Signature(); return typeMap.CLISignature();
} }
FunctionType func; FunctionType func;
@ -168,7 +168,7 @@ namespace Cxxi.Generators.CLI
{ {
typeMap.Declaration = decl; typeMap.Declaration = decl;
typeMap.Type = template; typeMap.Type = template;
return typeMap.Signature(); return typeMap.CLISignature();
} }
return decl.Name; return decl.Name;

2
src/Generator/Generators/CSharp/CSharpTypePrinter.cs

@ -95,7 +95,7 @@ namespace Cxxi.Generators.CSharp
TypeMap typeMap = null; TypeMap typeMap = null;
if (TypeMapDatabase.FindTypeMap(decl, out typeMap)) if (TypeMapDatabase.FindTypeMap(decl, out typeMap))
{ {
return typeMap.Signature(); return typeMap.CSharpSignature();
} }
FunctionType func; FunctionType func;

38
src/Generator/Types/Std/Stdlib.cs

@ -12,38 +12,38 @@ namespace Cxxi.Types.Std
[TypeMap("std::string")] [TypeMap("std::string")]
public class String : TypeMap public class String : TypeMap
{ {
public override string Signature() public override string CLISignature()
{ {
return "System::String^"; return "System::String^";
} }
public override string MarshalToNative(MarshalContext ctx) public override void CLIMarshalToNative(MarshalContext ctx)
{ {
return string.Format("marshalString<E_UTF8>({0})", ctx.Parameter.Name); ctx.Return.Write("marshalString<E_UTF8>({0})", ctx.Parameter.Name);
} }
public override string MarshalFromNative(MarshalContext ctx) public override void CLIMarshalToManaged(MarshalContext ctx)
{ {
return string.Format("marshalString<E_UTF8>({0})", ctx.ReturnVarName); ctx.Return.Write("marshalString<E_UTF8>({0})", ctx.ReturnVarName);
} }
} }
[TypeMap("std::wstring")] [TypeMap("std::wstring")]
public class WString : TypeMap public class WString : TypeMap
{ {
public override string Signature() public override string CLISignature()
{ {
return "System::String^"; return "System::String^";
} }
public override string MarshalToNative(MarshalContext ctx) public override void CLIMarshalToNative(MarshalContext ctx)
{ {
return string.Format("marshalString<E_UTF16>({0})", ctx.Parameter.Name); ctx.Return.Write("marshalString<E_UTF16>({0})", ctx.Parameter.Name);
} }
public override string MarshalFromNative(MarshalContext ctx) public override void CLIMarshalToManaged(MarshalContext ctx)
{ {
return string.Format("marshalString<E_UTF16>({0})", ctx.ReturnVarName); ctx.Return.Write("marshalString<E_UTF16>({0})", ctx.ReturnVarName);
} }
} }
@ -52,19 +52,19 @@ namespace Cxxi.Types.Std
{ {
public override bool IsIgnored { get { return true; } } public override bool IsIgnored { get { return true; } }
public override string Signature() public override string CLISignature()
{ {
var type = Type as TemplateSpecializationType; var type = Type as TemplateSpecializationType;
var typeName = type.Arguments[0].Type.ToString(); var typeName = type.Arguments[0].Type.ToString();
return string.Format("System::Collections::Generic::List<{0}>^", typeName); 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(); throw new System.NotImplementedException();
} }
public override string MarshalFromNative(MarshalContext ctx) public override void CLIMarshalToManaged(MarshalContext ctx)
{ {
throw new System.NotImplementedException(); throw new System.NotImplementedException();
} }
@ -75,7 +75,7 @@ namespace Cxxi.Types.Std
{ {
public override bool IsIgnored { get { return true; } } public override bool IsIgnored { get { return true; } }
public override string Signature() public override string CLISignature()
{ {
var type = Type as TemplateSpecializationType; var type = Type as TemplateSpecializationType;
return string.Format("System::Collections::Generic::Dictionary<{0}, {1}>^", return string.Format("System::Collections::Generic::Dictionary<{0}, {1}>^",
@ -83,12 +83,12 @@ namespace Cxxi.Types.Std
type.Arguments[1].Type); type.Arguments[1].Type);
} }
public override string MarshalToNative(MarshalContext ctx) public override void CLIMarshalToNative(MarshalContext ctx)
{ {
throw new System.NotImplementedException(); throw new System.NotImplementedException();
} }
public override string MarshalFromNative(MarshalContext ctx) public override void CLIMarshalToManaged(MarshalContext ctx)
{ {
throw new System.NotImplementedException(); throw new System.NotImplementedException();
} }
@ -103,17 +103,17 @@ namespace Cxxi.Types.Std
[TypeMap("std::shared_ptr")] [TypeMap("std::shared_ptr")]
public class SharedPtr : TypeMap public class SharedPtr : TypeMap
{ {
public override string Signature() public override string CLISignature()
{ {
throw new System.NotImplementedException(); throw new System.NotImplementedException();
} }
public override string MarshalToNative(MarshalContext ctx) public override void CLIMarshalToNative(MarshalContext ctx)
{ {
throw new System.NotImplementedException(); throw new System.NotImplementedException();
} }
public override string MarshalFromNative(MarshalContext ctx) public override void CLIMarshalToManaged(MarshalContext ctx)
{ {
throw new System.NotImplementedException(); throw new System.NotImplementedException();
} }

46
src/Generator/Types/TypeMap.cs

@ -1,14 +1,27 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using Cxxi.Generators.CLI;
namespace Cxxi.Types namespace Cxxi.Types
{ {
public class MarshalContext 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 string ReturnVarName { get; set; }
public Type ReturnType { get; set; } public Type ReturnType { get; set; }
public string ArgName { get; set; }
public Parameter Parameter { get; set; } public Parameter Parameter { get; set; }
public int ParameterIndex { get; set; } public int ParameterIndex { get; set; }
public Function Function { get; set; } public Function Function { get; set; }
@ -45,26 +58,49 @@ namespace Cxxi.Types
get { return false; } get { return false; }
} }
public virtual string Signature() #region C# backend
public virtual string CSharpSignature()
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public virtual string MarshalToNative(MarshalContext ctx) public virtual void CSharpMarshalToNative(MarshalContext ctx)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public virtual string MarshalFromNative(MarshalContext ctx) public virtual void CSharpMarshalToManaged(MarshalContext ctx)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
#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 public interface ITypeMapDatabase
{ {
bool FindTypeMap(Declaration decl, out TypeMap typeMap);
bool FindTypeMap(Type type, out TypeMap typeMap); bool FindTypeMap(Type type, out TypeMap typeMap);
bool FindTypeMap(Declaration decl, out TypeMap typeMap);
bool FindTypeMap(string name, out TypeMap typeMap); bool FindTypeMap(string name, out TypeMap typeMap);
} }

Loading…
Cancel
Save