From 515b3c729546fef9d8ef272e5a8a4955bb40f014 Mon Sep 17 00:00:00 2001 From: Alex Corrado Date: Tue, 14 Jun 2011 00:07:38 -0400 Subject: [PATCH] T4 cleanup and add native fields --- src/generator/Access.cs | 9 + src/generator/Field.cs | 7 +- src/generator/Generator.cs | 2 +- src/generator/Makefile.am | 1 + src/generator/Templates/CSharp/CSharpClass.cs | 274 ++++++++++++------ src/generator/Templates/CSharp/CSharpClass.tt | 68 +++-- src/generator/Templates/CSharp/CSharpLibs.cs | 2 +- src/generator/Templates/CSharp/CSharpLibs.tt | 2 +- src/generator/generator.csproj | 1 + 9 files changed, 256 insertions(+), 110 deletions(-) create mode 100644 src/generator/Access.cs diff --git a/src/generator/Access.cs b/src/generator/Access.cs new file mode 100644 index 00000000..96098ea2 --- /dev/null +++ b/src/generator/Access.cs @@ -0,0 +1,9 @@ +using System; + +public enum Access { + @private, + @protected, + @public +} + + diff --git a/src/generator/Field.cs b/src/generator/Field.cs index 4792a377..3b3616e9 100644 --- a/src/generator/Field.cs +++ b/src/generator/Field.cs @@ -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 { public CppType Type { get; set; } + + public Access Access { + get; set; + } } diff --git a/src/generator/Generator.cs b/src/generator/Generator.cs index 60eedebd..bed6f131 100644 --- a/src/generator/Generator.cs +++ b/src/generator/Generator.cs @@ -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; diff --git a/src/generator/Makefile.am b/src/generator/Makefile.am index 31adddf1..705b79a5 100644 --- a/src/generator/Makefile.am +++ b/src/generator/Makefile.am @@ -48,6 +48,7 @@ RESGEN=resgen2 all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) FILES = \ + Access.cs \ Class.cs \ Field.cs \ Generator.cs \ diff --git a/src/generator/Templates/CSharp/CSharpClass.cs b/src/generator/Templates/CSharp/CSharpClass.cs index 6e8c5eb9..52156669 100644 --- a/src/generator/Templates/CSharp/CSharpClass.cs +++ b/src/generator/Templates/CSharp/CSharpClass.cs @@ -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 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 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) 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) 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) 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) 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) 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) #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)) { 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)) { #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 diff --git a/src/generator/Templates/CSharp/CSharpClass.tt b/src/generator/Templates/CSharp/CSharpClass.tt index e6c3d58a..76b8687a 100644 --- a/src/generator/Templates/CSharp/CSharpClass.tt +++ b/src/generator/Templates/CSharp/CSharpClass.tt @@ -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 #> { 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 #> { 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 #> { 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 #> { 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 #> { <# /* 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)) { 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)) { <#+ 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 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 parameters, bool writeType, bool } } +private string GetCSharpType (CppType t) +{ + return GetCSharpType (Generator.CppTypeToManaged (t)); +} + private string GetCSharpType (string str) { switch (str) { diff --git a/src/generator/Templates/CSharp/CSharpLibs.cs b/src/generator/Templates/CSharp/CSharpLibs.cs index fca550b8..b7ddfb8b 100644 --- a/src/generator/Templates/CSharp/CSharpLibs.cs +++ b/src/generator/Templates/CSharp/CSharpLibs.cs @@ -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 diff --git a/src/generator/Templates/CSharp/CSharpLibs.tt b/src/generator/Templates/CSharp/CSharpLibs.tt index 31dd61d7..e95fe73f 100644 --- a/src/generator/Templates/CSharp/CSharpLibs.tt +++ b/src/generator/Templates/CSharp/CSharpLibs.tt @@ -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 #>); } } diff --git a/src/generator/generator.csproj b/src/generator/generator.csproj index b6f73ff2..72ffebc7 100644 --- a/src/generator/generator.csproj +++ b/src/generator/generator.csproj @@ -68,6 +68,7 @@ CSharpLibs.tt +