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

2
src/generator/Generator.cs

@ -209,7 +209,7 @@ public class Generator { @@ -209,7 +209,7 @@ public class Generator {
else
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;
case "Constructor":
ctor = true;

1
src/generator/Makefile.am

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

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

@ -19,14 +19,14 @@ namespace Templates { @@ -19,14 +19,14 @@ namespace Templates {
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)
{
var returnType = GetCSharpType (Generator.CppTypeToManaged (method.ReturnType));
var returnType = GetCSharpType (method.ReturnType);
if (method.IsVirtual)
WriteLine (string.Format ("[OverrideNative (\"{0}\")]", method.Name));
WriteLine ("[OverrideNative (\"{0}\")]", method.Name);
Write (CurrentIndent + "public ");
if (method.IsConstructor) {
@ -62,12 +62,12 @@ private void WriteParameters (IList<Parameter> parameters, bool writeType, bool @@ -62,12 +62,12 @@ private void WriteParameters (IList<Parameter> parameters, bool writeType, bool
if (i != 0)
Write (", ");
var type = GetCSharpType (Generator.CppTypeToManaged (parameters [i].Type));
var type = GetCSharpType (parameters [i].Type);
if (writeAttributes) {
var mangleAs = parameters [i].Type.ToString ();
if (mangleAs != "" && mangleAs != type)
Write (string.Format ("[MangleAs (\"{0}\")] ", mangleAs));
Write ("[MangleAs (\"{0}\")] ", mangleAs);
if (IsByVal (parameters [i].Type))
Write ("[ByVal] ");
}
@ -86,6 +86,11 @@ private void WriteParameters (IList<Parameter> parameters, bool writeType, bool @@ -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)
{
switch (str) {
@ -363,7 +368,7 @@ private bool IsByVal (CppType t) @@ -363,7 +368,7 @@ private bool IsByVal (CppType t)
if (IsByVal (method.ReturnType)) {
Write ("[return: ByVal] ");
}
Write (GetCSharpType (Generator.CppTypeToManaged (method.ReturnType)));
Write (GetCSharpType (method.ReturnType));
Write (" ");
Write (method.Name);
@ -377,168 +382,228 @@ private bool IsByVal (CppType t) @@ -377,168 +382,228 @@ private bool IsByVal (CppType t)
WriteParameters (method.Parameters, true, !method.IsVirtual);
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 ();
#line default
#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");
#line default
#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 */
#line default
#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 ");
#line default
#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 ));
#line default
#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");
#line default
#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) {
#line default
#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 ");
#line default
#line hidden
#line 76 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( GetCSharpType (Generator.CppTypeToManaged (field.Type)) ));
#line 79 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( GetCSharpType (field.Type) ));
#line default
#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(" ");
#line default
#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 ));
#line default
#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");
#line default
#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 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");
#line default
#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 */
#line default
#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 ");
#line default
#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 ));
#line default
#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");
#line default
#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 ));
#line default
#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");
#line default
#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 */
#line default
#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 ");
#line default
#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 ));
#line default
#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");
#line default
#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 ));
#line default
#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");
#line default
#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 */
#line default
#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");
foreach (var method in Class.Methods.Where (m => m.GenWrapperMethod)) {
@ -549,7 +614,7 @@ private bool IsByVal (CppType t) @@ -549,7 +614,7 @@ private bool IsByVal (CppType t)
Write (CurrentIndent);
}
Write (string.Format ("impl.{0} (", method.Name));
Write ("impl.{0} (", method.Name);
if (!method.IsStatic) {
Write ("Native");
if (method.Parameters.Count != 0)
@ -558,29 +623,29 @@ private bool IsByVal (CppType t) @@ -558,29 +623,29 @@ private bool IsByVal (CppType t)
WriteParameters (method.Parameters, false, false);
PopIndent ();
Write (string.Format (");\n{0}}}\n\n", CurrentIndent));
Write (");\n{0}}}\n\n", CurrentIndent);
}
ClearIndent ();
#line default
#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");
#line default
#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 */
#line default
#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");
foreach (var prop in Class.Properties) {
var type = GetCSharpType (Generator.CppTypeToManaged (prop.Type));
var type = GetCSharpType (prop.Type);
Write (CurrentIndent + "public ");
@ -598,21 +663,21 @@ private bool IsByVal (CppType t) @@ -598,21 +663,21 @@ private bool IsByVal (CppType t)
if (prop.GetMethod != null) {
if (prop.GetMethod.IsVirtual)
Write (string.Format ("[OverrideNative (\"{0}\")] ", prop.GetMethod.Name));
Write ("[OverrideNative (\"{0}\")] ", prop.GetMethod.Name);
Write ("get {\n");
PushIndent ("\t");
WriteLine (string.Format ("return impl.{0} (Native);", prop.GetMethod.Name));
WriteLine ("return impl.{0} (Native);", prop.GetMethod.Name);
PopIndent ();
WriteLine ("}");
}
if (prop.SetMethod != null) {
if (prop.SetMethod.IsVirtual)
Write (string.Format ("[OverrideNative (\"{0}\")] ", prop.SetMethod.Name));
Write ("[OverrideNative (\"{0}\")] ", prop.SetMethod.Name);
Write ("set {\n");
PushIndent ("\t");
WriteLine (string.Format ("impl.{0} (Native, value);", prop.SetMethod.Name));
WriteLine ("impl.{0} (Native, value);", prop.SetMethod.Name);
PopIndent ();
WriteLine ("}");
}
@ -625,136 +690,173 @@ private bool IsByVal (CppType t) @@ -625,136 +690,173 @@ private bool IsByVal (CppType t)
#line default
#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");
#line default
#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 */
foreach (var npBase in Class.BaseClasses.Skip (1)) {
var npImpl = npBase.Name + "_impl";
var prop = npBase.Name;
var field = prop + "_lazy";
#line default
#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 ");
#line default
#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 ));
#line default
#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 ");
#line default
#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 ));
#line default
#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(" ");
#line default
#line hidden
#line 166 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( npImpl ));
#line 184 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( field ));
#line default
#line hidden
#line 166 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(";\n\t\tpublic static implicit operator ");
#line 184 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(";\n\t\tpublic ");
#line default
#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 ));
#line default
#line hidden
#line 167 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("(");
#line 185 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" ");
#line default
#line hidden
#line 167 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( wrapper ));
#line 185 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( prop ));
#line default
#line hidden
#line 167 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" subClass)\n\t\t{\n\t\t\tif (subClass.");
#line 185 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" {\n\t\t\tget {\n\t\t\t\tif (");
#line default
#line hidden
#line 169 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( npImpl ));
#line 187 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( field ));
#line default
#line hidden
#line 169 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" == null)\n\t\t\t\tsubClass.");
#line 187 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(" == null)\n\t\t\t\t\t");
#line default
#line hidden
#line 170 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( npImpl ));
#line 188 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( field ));
#line default
#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<");
#line default
#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 ));
#line default
#line hidden
#line 170 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("> (subClass);\n\t\t\treturn subClass.");
#line 192 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write("(");
#line default
#line hidden
#line 171 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( npImpl ));
#line 192 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt"
this.Write(this.ToStringHelper.ToStringWithCulture( wrapper ));
#line default
#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");
#line default
#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");
foreach (var method in npBase.Methods) {
// 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)) { @@ -765,11 +867,11 @@ foreach (var npBase in Class.BaseClasses.Skip (1)) {
WriteMethodHeader (method, initBases);
Write (string.Format ("(({0})this).{1} (", npBase.Name, method.FormattedName));
Write ("{0}.{1} (", prop, method.FormattedName);
WriteParameters (method.Parameters, false, false);
PopIndent ();
Write (string.Format (");\n{0}}}\n\n", CurrentIndent));
Write (");\n{0}}}\n\n", CurrentIndent);
}
ClearIndent ();
}
@ -777,43 +879,43 @@ foreach (var npBase in Class.BaseClasses.Skip (1)) { @@ -777,43 +879,43 @@ foreach (var npBase in Class.BaseClasses.Skip (1)) {
#line default
#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 ");
#line default
#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" ));
#line default
#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");
#line default
#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)) {
#line default
#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");
#line default
#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 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");
#line default

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

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

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

@ -72,7 +72,7 @@ namespace Templates { @@ -72,7 +72,7 @@ namespace Templates {
#line hidden
#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 hidden

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

@ -13,7 +13,7 @@ namespace <#= Generator.Namespace #> { @@ -13,7 +13,7 @@ namespace <#= Generator.Namespace #> {
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 @@ @@ -68,6 +68,7 @@
<Compile Include="Templates\CSharp\CSharpLibs.cs">
<DependentUpon>CSharpLibs.tt</DependentUpon>
</Compile>
<Compile Include="Access.cs" />
</ItemGroup>
<ItemGroup>
<Reference Include="System">

Loading…
Cancel
Save