Browse Source

T4 cleanup and add native fields

pull/1/head
Alex Corrado 14 years ago
parent
commit
515b3c7295
  1. 9
      src/generator/Access.cs
  2. 7
      src/generator/Field.cs
  3. 2
      src/generator/Generator.cs
  4. 1
      src/generator/Makefile.am
  5. 274
      src/generator/Templates/CSharp/CSharpClass.cs
  6. 68
      src/generator/Templates/CSharp/CSharpClass.tt
  7. 2
      src/generator/Templates/CSharp/CSharpLibs.cs
  8. 2
      src/generator/Templates/CSharp/CSharpLibs.tt
  9. 1
      src/generator/generator.csproj

9
src/generator/Access.cs

@ -0,0 +1,9 @@
using System;
public enum Access {
@private,
@protected,
@public
}

7
src/generator/Field.cs

@ -36,9 +36,10 @@ using Mono.VisualC.Interop;
public class Field { public class Field {
public Field (string name, CppType type) { public Field (string name, CppType type, Access access) {
Name = name; Name = name;
Type = type; Type = type;
Access = access;
} }
public string Name { public string Name {
@ -48,4 +49,8 @@ public class Field {
public CppType Type { public CppType Type {
get; set; get; set;
} }
public Access Access {
get; set;
}
} }

2
src/generator/Generator.cs

@ -209,7 +209,7 @@ public class Generator {
else else
fieldName = "field" + fieldCount++; fieldName = "field" + fieldCount++;
klass.Fields.Add (new Field (fieldName, fieldType)); klass.Fields.Add (new Field (fieldName, fieldType, (Access)Enum.Parse (typeof (Access), n ["access"])));
break; break;
case "Constructor": case "Constructor":
ctor = true; ctor = true;

1
src/generator/Makefile.am

@ -48,6 +48,7 @@ RESGEN=resgen2
all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES)
FILES = \ FILES = \
Access.cs \
Class.cs \ Class.cs \
Field.cs \ Field.cs \
Generator.cs \ Generator.cs \

274
src/generator/Templates/CSharp/CSharpClass.cs

@ -19,14 +19,14 @@ namespace Templates {
public partial class CSharpClass : Base { public partial class CSharpClass : Base {
#line 204 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 227 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
private void WriteMethodHeader (Method method, string initBases) private void WriteMethodHeader (Method method, string initBases)
{ {
var returnType = GetCSharpType (Generator.CppTypeToManaged (method.ReturnType)); var returnType = GetCSharpType (method.ReturnType);
if (method.IsVirtual) if (method.IsVirtual)
WriteLine (string.Format ("[OverrideNative (\"{0}\")]", method.Name)); WriteLine ("[OverrideNative (\"{0}\")]", method.Name);
Write (CurrentIndent + "public "); Write (CurrentIndent + "public ");
if (method.IsConstructor) { if (method.IsConstructor) {
@ -62,12 +62,12 @@ private void WriteParameters (IList<Parameter> parameters, bool writeType, bool
if (i != 0) if (i != 0)
Write (", "); Write (", ");
var type = GetCSharpType (Generator.CppTypeToManaged (parameters [i].Type)); var type = GetCSharpType (parameters [i].Type);
if (writeAttributes) { if (writeAttributes) {
var mangleAs = parameters [i].Type.ToString (); var mangleAs = parameters [i].Type.ToString ();
if (mangleAs != "" && mangleAs != type) if (mangleAs != "" && mangleAs != type)
Write (string.Format ("[MangleAs (\"{0}\")] ", mangleAs)); Write ("[MangleAs (\"{0}\")] ", mangleAs);
if (IsByVal (parameters [i].Type)) if (IsByVal (parameters [i].Type))
Write ("[ByVal] "); Write ("[ByVal] ");
} }
@ -86,6 +86,11 @@ private void WriteParameters (IList<Parameter> parameters, bool writeType, bool
} }
} }
private string GetCSharpType (CppType t)
{
return GetCSharpType (Generator.CppTypeToManaged (t));
}
private string GetCSharpType (string str) private string GetCSharpType (string str)
{ {
switch (str) { switch (str) {
@ -363,7 +368,7 @@ private bool IsByVal (CppType t)
if (IsByVal (method.ReturnType)) { if (IsByVal (method.ReturnType)) {
Write ("[return: ByVal] "); Write ("[return: ByVal] ");
} }
Write (GetCSharpType (Generator.CppTypeToManaged (method.ReturnType))); Write (GetCSharpType (method.ReturnType));
Write (" "); Write (" ");
Write (method.Name); Write (method.Name);
@ -377,168 +382,228 @@ private bool IsByVal (CppType t)
WriteParameters (method.Parameters, true, !method.IsVirtual); WriteParameters (method.Parameters, true, !method.IsVirtual);
Write (");\n"); Write (");\n");
} }
foreach (var field in Class.Fields.Where (f => f.Access != Access.@private)) {
WriteLine ("CppField<{0}> {1} {{ get; }}", GetCSharpType (field.Type), field.Name);
}
ClearIndent (); ClearIndent ();
#line default #line default
#line hidden #line hidden
#line 72 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 75 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\t\t}\n"); this.Write("\t\t}\n");
#line default #line default
#line hidden #line hidden
#line 73 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 76 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
/* Native layout */ /* Native layout */
#line default #line default
#line hidden #line hidden
#line 74 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 77 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\t\tprivate struct "); this.Write("\t\tprivate struct ");
#line default #line default
#line hidden #line hidden
#line 74 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 77 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( layout )); this.Write(this.ToStringHelper.ToStringWithCulture( layout ));
#line default #line default
#line hidden #line hidden
#line 74 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 77 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" {\n"); this.Write(" {\n");
#line default #line default
#line hidden #line hidden
#line 75 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 78 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
foreach (var field in Class.Fields) { foreach (var field in Class.Fields) {
#line default #line default
#line hidden #line hidden
#line 76 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 79 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\t\t\tpublic "); this.Write("\t\t\tpublic ");
#line default #line default
#line hidden #line hidden
#line 76 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 79 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( GetCSharpType (Generator.CppTypeToManaged (field.Type)) )); this.Write(this.ToStringHelper.ToStringWithCulture( GetCSharpType (field.Type) ));
#line default #line default
#line hidden #line hidden
#line 76 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 79 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" "); this.Write(" ");
#line default #line default
#line hidden #line hidden
#line 76 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 79 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( field.Name )); this.Write(this.ToStringHelper.ToStringWithCulture( field.Name ));
#line default #line default
#line hidden #line hidden
#line 76 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 79 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(";\n"); this.Write(";\n");
#line default #line default
#line hidden #line hidden
#line 77 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 80 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
} }
#line default #line default
#line hidden #line hidden
#line 78 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 81 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\t\t}\n\n"); this.Write("\t\t}\n\n");
#line default #line default
#line hidden #line hidden
#line 80 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 83 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
/* Native fields */
#line default
#line hidden
#line 84 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
PushIndent ("\t\t");
foreach (var field in Class.Fields.Where (f => f.Access != Access.@private)) {
WriteLine ("{0} {1} {2} {{", field.Access, GetCSharpType (field.Type), field.Name);
#line default
#line hidden
#line 87 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\t\t\tget {\n\t\t\t\treturn impl.");
#line default
#line hidden
#line 88 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( field.Name ));
#line default
#line hidden
#line 88 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" [Native];\n\t\t\t}\n\t\t\tset {\n\t\t\t\timpl.");
#line default
#line hidden
#line 91 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( field.Name ));
#line default
#line hidden
#line 91 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" [Native] = value;\n\t\t\t}\n\t\t}\n");
#line default
#line hidden
#line 94 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
}
ClearIndent();
#line default
#line hidden
#line 96 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\n");
#line default
#line hidden
#line 97 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
/* Native constructor */ /* Native constructor */
#line default #line default
#line hidden #line hidden
#line 81 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 98 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\t\tpublic "); this.Write("\t\tpublic ");
#line default #line default
#line hidden #line hidden
#line 81 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 98 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); this.Write(this.ToStringHelper.ToStringWithCulture( wrapper ));
#line default #line default
#line hidden #line hidden
#line 81 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 98 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" (CppInstancePtr native)\n\t\t"); this.Write(" (CppInstancePtr native)\n\t\t");
#line default #line default
#line hidden #line hidden
#line 82 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 99 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( initBases )); this.Write(this.ToStringHelper.ToStringWithCulture( initBases ));
#line default #line default
#line hidden #line hidden
#line 82 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 99 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\n\t\t\tNative = native;\n\t\t}\n\n"); this.Write("\n\t\t\tNative = native;\n\t\t}\n\n");
#line default #line default
#line hidden #line hidden
#line 86 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 103 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
/* Subclass constructor */ /* Subclass constructor */
#line default #line default
#line hidden #line hidden
#line 87 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 104 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\t\tpublic "); this.Write("\t\tpublic ");
#line default #line default
#line hidden #line hidden
#line 87 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 104 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); this.Write(this.ToStringHelper.ToStringWithCulture( wrapper ));
#line default #line default
#line hidden #line hidden
#line 87 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 104 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" (CppTypeInfo subClass)\n\t\t"); this.Write(" (CppTypeInfo subClass)\n\t\t");
#line default #line default
#line hidden #line hidden
#line 88 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 105 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( initBases )); this.Write(this.ToStringHelper.ToStringWithCulture( initBases ));
#line default #line default
#line hidden #line hidden
#line 88 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 105 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\n\t\t\tsubClass.AddBase (impl.TypeInfo);\n\t\t}\n\n"); this.Write("\n\t\t\tsubClass.AddBase (impl.TypeInfo);\n\t\t}\n\n");
#line default #line default
#line hidden #line hidden
#line 92 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 109 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
/* Wrapper methods */ /* Wrapper methods */
#line default #line default
#line hidden #line hidden
#line 93 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 110 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
PushIndent ("\t\t"); PushIndent ("\t\t");
foreach (var method in Class.Methods.Where (m => m.GenWrapperMethod)) { foreach (var method in Class.Methods.Where (m => m.GenWrapperMethod)) {
@ -549,7 +614,7 @@ private bool IsByVal (CppType t)
Write (CurrentIndent); Write (CurrentIndent);
} }
Write (string.Format ("impl.{0} (", method.Name)); Write ("impl.{0} (", method.Name);
if (!method.IsStatic) { if (!method.IsStatic) {
Write ("Native"); Write ("Native");
if (method.Parameters.Count != 0) if (method.Parameters.Count != 0)
@ -558,29 +623,29 @@ private bool IsByVal (CppType t)
WriteParameters (method.Parameters, false, false); WriteParameters (method.Parameters, false, false);
PopIndent (); PopIndent ();
Write (string.Format (");\n{0}}}\n\n", CurrentIndent)); Write (");\n{0}}}\n\n", CurrentIndent);
} }
ClearIndent (); ClearIndent ();
#line default #line default
#line hidden #line hidden
#line 115 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 132 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\n"); this.Write("\n");
#line default #line default
#line hidden #line hidden
#line 116 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 133 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
/* Wrapper properties */ /* Wrapper properties */
#line default #line default
#line hidden #line hidden
#line 117 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 134 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
PushIndent ("\t\t"); PushIndent ("\t\t");
foreach (var prop in Class.Properties) { foreach (var prop in Class.Properties) {
var type = GetCSharpType (Generator.CppTypeToManaged (prop.Type)); var type = GetCSharpType (prop.Type);
Write (CurrentIndent + "public "); Write (CurrentIndent + "public ");
@ -598,21 +663,21 @@ private bool IsByVal (CppType t)
if (prop.GetMethod != null) { if (prop.GetMethod != null) {
if (prop.GetMethod.IsVirtual) if (prop.GetMethod.IsVirtual)
Write (string.Format ("[OverrideNative (\"{0}\")] ", prop.GetMethod.Name)); Write ("[OverrideNative (\"{0}\")] ", prop.GetMethod.Name);
Write ("get {\n"); Write ("get {\n");
PushIndent ("\t"); PushIndent ("\t");
WriteLine (string.Format ("return impl.{0} (Native);", prop.GetMethod.Name)); WriteLine ("return impl.{0} (Native);", prop.GetMethod.Name);
PopIndent (); PopIndent ();
WriteLine ("}"); WriteLine ("}");
} }
if (prop.SetMethod != null) { if (prop.SetMethod != null) {
if (prop.SetMethod.IsVirtual) if (prop.SetMethod.IsVirtual)
Write (string.Format ("[OverrideNative (\"{0}\")] ", prop.SetMethod.Name)); Write ("[OverrideNative (\"{0}\")] ", prop.SetMethod.Name);
Write ("set {\n"); Write ("set {\n");
PushIndent ("\t"); PushIndent ("\t");
WriteLine (string.Format ("impl.{0} (Native, value);", prop.SetMethod.Name)); WriteLine ("impl.{0} (Native, value);", prop.SetMethod.Name);
PopIndent (); PopIndent ();
WriteLine ("}"); WriteLine ("}");
} }
@ -625,136 +690,173 @@ private bool IsByVal (CppType t)
#line default #line default
#line hidden #line hidden
#line 160 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 177 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\n"); this.Write("\n");
#line default #line default
#line hidden #line hidden
#line 161 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 178 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
/* Make this wrapper castable to non-primary bases */ /* Make this wrapper castable to non-primary bases */
foreach (var npBase in Class.BaseClasses.Skip (1)) { foreach (var npBase in Class.BaseClasses.Skip (1)) {
var npImpl = npBase.Name + "_impl"; var prop = npBase.Name;
var field = prop + "_lazy";
#line default #line default
#line hidden #line hidden
#line 165 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 183 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\t\t// Non-primary base class implementation for "); this.Write("\t\t// Non-primary base class implementation for ");
#line default #line default
#line hidden #line hidden
#line 165 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 183 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name ));
#line default #line default
#line hidden #line hidden
#line 165 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 183 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(":\n\t\tprivate "); this.Write(":\n\t\tprivate ");
#line default #line default
#line hidden #line hidden
#line 166 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 184 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name ));
#line default #line default
#line hidden #line hidden
#line 166 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 184 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" "); this.Write(" ");
#line default #line default
#line hidden #line hidden
#line 166 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 184 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( npImpl )); this.Write(this.ToStringHelper.ToStringWithCulture( field ));
#line default #line default
#line hidden #line hidden
#line 166 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 184 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(";\n\t\tpublic static implicit operator "); this.Write(";\n\t\tpublic ");
#line default #line default
#line hidden #line hidden
#line 167 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 185 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name ));
#line default #line default
#line hidden #line hidden
#line 167 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 185 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("("); this.Write(" ");
#line default #line default
#line hidden #line hidden
#line 167 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 185 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); this.Write(this.ToStringHelper.ToStringWithCulture( prop ));
#line default #line default
#line hidden #line hidden
#line 167 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 185 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" subClass)\n\t\t{\n\t\t\tif (subClass."); this.Write(" {\n\t\t\tget {\n\t\t\t\tif (");
#line default #line default
#line hidden #line hidden
#line 169 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 187 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( npImpl )); this.Write(this.ToStringHelper.ToStringWithCulture( field ));
#line default #line default
#line hidden #line hidden
#line 169 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 187 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" == null)\n\t\t\t\tsubClass."); this.Write(" == null)\n\t\t\t\t\t");
#line default #line default
#line hidden #line hidden
#line 170 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 188 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( npImpl )); this.Write(this.ToStringHelper.ToStringWithCulture( field ));
#line default #line default
#line hidden #line hidden
#line 170 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 188 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" = impl.TypeInfo.Cast<"); this.Write(" = impl.TypeInfo.Cast<");
#line default #line default
#line hidden #line hidden
#line 170 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 188 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name ));
#line default
#line hidden
#line 188 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("> (this);\n\t\t\t\treturn ");
#line default
#line hidden
#line 189 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( field ));
#line default
#line hidden
#line 189 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(";\n\t\t\t}\n\t\t}\n\t\tpublic static implicit operator ");
#line default
#line hidden
#line 192 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name ));
#line default #line default
#line hidden #line hidden
#line 170 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 192 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("> (subClass);\n\t\t\treturn subClass."); this.Write("(");
#line default #line default
#line hidden #line hidden
#line 171 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 192 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( npImpl )); this.Write(this.ToStringHelper.ToStringWithCulture( wrapper ));
#line default #line default
#line hidden #line hidden
#line 171 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 192 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" subClass)\n\t\t{\n\t\t\treturn subClass.");
#line default
#line hidden
#line 194 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( prop ));
#line default
#line hidden
#line 194 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(";\n\t\t}\n\n"); this.Write(";\n\t\t}\n\n");
#line default #line default
#line hidden #line hidden
#line 174 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 197 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
PushIndent ("\t\t"); PushIndent ("\t\t");
foreach (var method in npBase.Methods) { foreach (var method in npBase.Methods) {
// With the exception of virtual methods that have been overridden, these methods must be called // With the exception of virtual methods that have been overridden, these methods must be called
@ -765,11 +867,11 @@ foreach (var npBase in Class.BaseClasses.Skip (1)) {
WriteMethodHeader (method, initBases); WriteMethodHeader (method, initBases);
Write (string.Format ("(({0})this).{1} (", npBase.Name, method.FormattedName)); Write ("{0}.{1} (", prop, method.FormattedName);
WriteParameters (method.Parameters, false, false); WriteParameters (method.Parameters, false, false);
PopIndent (); PopIndent ();
Write (string.Format (");\n{0}}}\n\n", CurrentIndent)); Write (");\n{0}}}\n\n", CurrentIndent);
} }
ClearIndent (); ClearIndent ();
} }
@ -777,43 +879,43 @@ foreach (var npBase in Class.BaseClasses.Skip (1)) {
#line default #line default
#line hidden #line hidden
#line 192 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 215 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\n\t\tpublic "); this.Write("\n\t\tpublic ");
#line default #line default
#line hidden #line hidden
#line 193 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 216 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( hasBase? "override" : "virtual" )); this.Write(this.ToStringHelper.ToStringWithCulture( hasBase? "override" : "virtual" ));
#line default #line default
#line hidden #line hidden
#line 193 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 216 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" void Dispose ()\n\t\t{\n"); this.Write(" void Dispose ()\n\t\t{\n");
#line default #line default
#line hidden #line hidden
#line 195 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 218 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
if (Class.Methods.Any (m => m.IsDestructor && !m.IsArtificial)) { if (Class.Methods.Any (m => m.IsDestructor && !m.IsArtificial)) {
#line default #line default
#line hidden #line hidden
#line 196 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 219 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\t\t\timpl.Destruct (Native);\n"); this.Write("\t\t\timpl.Destruct (Native);\n");
#line default #line default
#line hidden #line hidden
#line 197 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 220 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
} }
#line default #line default
#line hidden #line hidden
#line 198 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" #line 221 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("\t\t\tNative.Dispose ();\n\t\t}\n\n\t}\n}\n\n"); this.Write("\t\t\tNative.Dispose ();\n\t\t}\n\n\t}\n}\n\n");
#line default #line default

68
src/generator/Templates/CSharp/CSharpClass.tt

@ -54,7 +54,7 @@ namespace <#= Generator.Namespace #> {
if (IsByVal (method.ReturnType)) { if (IsByVal (method.ReturnType)) {
Write ("[return: ByVal] "); Write ("[return: ByVal] ");
} }
Write (GetCSharpType (Generator.CppTypeToManaged (method.ReturnType))); Write (GetCSharpType (method.ReturnType));
Write (" "); Write (" ");
Write (method.Name); Write (method.Name);
@ -68,15 +68,32 @@ namespace <#= Generator.Namespace #> {
WriteParameters (method.Parameters, true, !method.IsVirtual); WriteParameters (method.Parameters, true, !method.IsVirtual);
Write (");\n"); Write (");\n");
} }
foreach (var field in Class.Fields.Where (f => f.Access != Access.@private)) {
WriteLine ("CppField<{0}> {1} {{ get; }}", GetCSharpType (field.Type), field.Name);
}
ClearIndent (); #> ClearIndent (); #>
} }
<# /* Native layout */ #> <# /* Native layout */ #>
private struct <#= layout #> { private struct <#= layout #> {
<# foreach (var field in Class.Fields) { #> <# foreach (var field in Class.Fields) { #>
public <#= GetCSharpType (Generator.CppTypeToManaged (field.Type)) #> <#= field.Name #>; public <#= GetCSharpType (field.Type) #> <#= field.Name #>;
<# } #> <# } #>
} }
<# /* Native fields */ #>
<# PushIndent ("\t\t");
foreach (var field in Class.Fields.Where (f => f.Access != Access.@private)) {
WriteLine ("{0} {1} {2} {{", field.Access, GetCSharpType (field.Type), field.Name); #>
get {
return impl.<#= field.Name #> [Native];
}
set {
impl.<#= field.Name #> [Native] = value;
}
}
<# }
ClearIndent(); #>
<# /* Native constructor */ #> <# /* Native constructor */ #>
public <#= wrapper #> (CppInstancePtr native) public <#= wrapper #> (CppInstancePtr native)
<#= initBases #> <#= initBases #>
@ -100,7 +117,7 @@ namespace <#= Generator.Namespace #> {
Write (CurrentIndent); Write (CurrentIndent);
} }
Write (string.Format ("impl.{0} (", method.Name)); Write ("impl.{0} (", method.Name);
if (!method.IsStatic) { if (!method.IsStatic) {
Write ("Native"); Write ("Native");
if (method.Parameters.Count != 0) if (method.Parameters.Count != 0)
@ -109,14 +126,14 @@ namespace <#= Generator.Namespace #> {
WriteParameters (method.Parameters, false, false); WriteParameters (method.Parameters, false, false);
PopIndent (); PopIndent ();
Write (string.Format (");\n{0}}}\n\n", CurrentIndent)); Write (");\n{0}}}\n\n", CurrentIndent);
} }
ClearIndent (); #> ClearIndent (); #>
<# /* Wrapper properties */ #> <# /* Wrapper properties */ #>
<# PushIndent ("\t\t"); <# PushIndent ("\t\t");
foreach (var prop in Class.Properties) { foreach (var prop in Class.Properties) {
var type = GetCSharpType (Generator.CppTypeToManaged (prop.Type)); var type = GetCSharpType (prop.Type);
Write (CurrentIndent + "public "); Write (CurrentIndent + "public ");
@ -134,21 +151,21 @@ namespace <#= Generator.Namespace #> {
if (prop.GetMethod != null) { if (prop.GetMethod != null) {
if (prop.GetMethod.IsVirtual) if (prop.GetMethod.IsVirtual)
Write (string.Format ("[OverrideNative (\"{0}\")] ", prop.GetMethod.Name)); Write ("[OverrideNative (\"{0}\")] ", prop.GetMethod.Name);
Write ("get {\n"); Write ("get {\n");
PushIndent ("\t"); PushIndent ("\t");
WriteLine (string.Format ("return impl.{0} (Native);", prop.GetMethod.Name)); WriteLine ("return impl.{0} (Native);", prop.GetMethod.Name);
PopIndent (); PopIndent ();
WriteLine ("}"); WriteLine ("}");
} }
if (prop.SetMethod != null) { if (prop.SetMethod != null) {
if (prop.SetMethod.IsVirtual) if (prop.SetMethod.IsVirtual)
Write (string.Format ("[OverrideNative (\"{0}\")] ", prop.SetMethod.Name)); Write ("[OverrideNative (\"{0}\")] ", prop.SetMethod.Name);
Write ("set {\n"); Write ("set {\n");
PushIndent ("\t"); PushIndent ("\t");
WriteLine (string.Format ("impl.{0} (Native, value);", prop.SetMethod.Name)); WriteLine ("impl.{0} (Native, value);", prop.SetMethod.Name);
PopIndent (); PopIndent ();
WriteLine ("}"); WriteLine ("}");
} }
@ -160,15 +177,21 @@ namespace <#= Generator.Namespace #> {
<# /* Make this wrapper castable to non-primary bases */ <# /* Make this wrapper castable to non-primary bases */
foreach (var npBase in Class.BaseClasses.Skip (1)) { foreach (var npBase in Class.BaseClasses.Skip (1)) {
var npImpl = npBase.Name + "_impl"; var prop = npBase.Name;
var field = prop + "_lazy";
#> #>
// Non-primary base class implementation for <#= npBase.Name #>: // Non-primary base class implementation for <#= npBase.Name #>:
private <#= npBase.Name #> <#= npImpl #>; private <#= npBase.Name #> <#= field #>;
public <#= npBase.Name #> <#= prop #> {
get {
if (<#= field #> == null)
<#= field #> = impl.TypeInfo.Cast<<#= npBase.Name #>> (this);
return <#= field #>;
}
}
public static implicit operator <#= npBase.Name #>(<#= wrapper #> subClass) public static implicit operator <#= npBase.Name #>(<#= wrapper #> subClass)
{ {
if (subClass.<#= npImpl #> == null) return subClass.<#= prop #>;
subClass.<#= npImpl #> = impl.TypeInfo.Cast<<#= npBase.Name #>> (subClass);
return subClass.<#= npImpl #>;
} }
<# PushIndent ("\t\t"); <# PushIndent ("\t\t");
@ -181,11 +204,11 @@ foreach (var npBase in Class.BaseClasses.Skip (1)) {
WriteMethodHeader (method, initBases); WriteMethodHeader (method, initBases);
Write (string.Format ("(({0})this).{1} (", npBase.Name, method.FormattedName)); Write ("{0}.{1} (", prop, method.FormattedName);
WriteParameters (method.Parameters, false, false); WriteParameters (method.Parameters, false, false);
PopIndent (); PopIndent ();
Write (string.Format (");\n{0}}}\n\n", CurrentIndent)); Write (");\n{0}}}\n\n", CurrentIndent);
} }
ClearIndent (); ClearIndent ();
} #> } #>
@ -204,10 +227,10 @@ foreach (var npBase in Class.BaseClasses.Skip (1)) {
<#+ <#+
private void WriteMethodHeader (Method method, string initBases) private void WriteMethodHeader (Method method, string initBases)
{ {
var returnType = GetCSharpType (Generator.CppTypeToManaged (method.ReturnType)); var returnType = GetCSharpType (method.ReturnType);
if (method.IsVirtual) if (method.IsVirtual)
WriteLine (string.Format ("[OverrideNative (\"{0}\")]", method.Name)); WriteLine ("[OverrideNative (\"{0}\")]", method.Name);
Write (CurrentIndent + "public "); Write (CurrentIndent + "public ");
if (method.IsConstructor) { if (method.IsConstructor) {
@ -243,12 +266,12 @@ private void WriteParameters (IList<Parameter> parameters, bool writeType, bool
if (i != 0) if (i != 0)
Write (", "); Write (", ");
var type = GetCSharpType (Generator.CppTypeToManaged (parameters [i].Type)); var type = GetCSharpType (parameters [i].Type);
if (writeAttributes) { if (writeAttributes) {
var mangleAs = parameters [i].Type.ToString (); var mangleAs = parameters [i].Type.ToString ();
if (mangleAs != "" && mangleAs != type) if (mangleAs != "" && mangleAs != type)
Write (string.Format ("[MangleAs (\"{0}\")] ", mangleAs)); Write ("[MangleAs (\"{0}\")] ", mangleAs);
if (IsByVal (parameters [i].Type)) if (IsByVal (parameters [i].Type))
Write ("[ByVal] "); Write ("[ByVal] ");
} }
@ -267,6 +290,11 @@ private void WriteParameters (IList<Parameter> parameters, bool writeType, bool
} }
} }
private string GetCSharpType (CppType t)
{
return GetCSharpType (Generator.CppTypeToManaged (t));
}
private string GetCSharpType (string str) private string GetCSharpType (string str)
{ {
switch (str) { switch (str) {

2
src/generator/Templates/CSharp/CSharpLibs.cs

@ -72,7 +72,7 @@ namespace Templates {
#line hidden #line hidden
#line 16 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpLibs.tt" #line 16 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpLibs.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( Generator.InlinePolicy.ToString () )); this.Write(this.ToStringHelper.ToStringWithCulture( Generator.InlinePolicy ));
#line default #line default
#line hidden #line hidden

2
src/generator/Templates/CSharp/CSharpLibs.tt

@ -13,7 +13,7 @@ namespace <#= Generator.Namespace #> {
public static partial class Libs { public static partial class Libs {
public static readonly CppLibrary <#= Generator.LibBaseName #> = new CppLibrary ("<#= Generator.LibBaseName #>", InlineMethods.<#= Generator.InlinePolicy.ToString () #>); public static readonly CppLibrary <#= Generator.LibBaseName #> = new CppLibrary ("<#= Generator.LibBaseName #>", InlineMethods.<#= Generator.InlinePolicy #>);
} }
} }

1
src/generator/generator.csproj

@ -68,6 +68,7 @@
<Compile Include="Templates\CSharp\CSharpLibs.cs"> <Compile Include="Templates\CSharp\CSharpLibs.cs">
<DependentUpon>CSharpLibs.tt</DependentUpon> <DependentUpon>CSharpLibs.tt</DependentUpon>
</Compile> </Compile>
<Compile Include="Access.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System"> <Reference Include="System">

Loading…
Cancel
Save