diff --git a/src/generator/Class.cs b/src/generator/Class.cs index 19ebe90f..abfc3d91 100644 --- a/src/generator/Class.cs +++ b/src/generator/Class.cs @@ -30,31 +30,28 @@ using System; using System.Collections.Generic; -public class Class { +public class Class : Namespace { - public Class (Node n) { - Node = n; + public Class (Node n) + : base (n) + { BaseClasses = new List (); - Methods = new List (); Fields = new List (); Properties = new List (); + Methods = new List (); + NestedClasses = new List (); + NestedEnums = new List (); } - public Node Node { + public List BaseClasses { get; set; } - public string Name { - get { - return Node.Name; - } - } - - public List BaseClasses { + public List NestedClasses { get; set; } - public List Methods { + public List NestedEnums { get; set; } @@ -66,6 +63,11 @@ public class Class { get; set; } + public List Methods { + get; + set; + } + public bool Disable { get; set; } diff --git a/src/generator/Enumeration.cs b/src/generator/Enumeration.cs new file mode 100644 index 00000000..df51d26b --- /dev/null +++ b/src/generator/Enumeration.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +public class Enumeration : Namespace { + + public struct Item { + public string Name; + public int Value; + } + + public Enumeration (Node n) + : base (n) + { + this.Items = new List (); + } + + public List Items { + get; set; + } +} + diff --git a/src/generator/Filter.cs b/src/generator/Filter.cs index 342a80c4..89d04f0e 100644 --- a/src/generator/Filter.cs +++ b/src/generator/Filter.cs @@ -28,7 +28,7 @@ public struct Filter { var rules = from rule in doc.Root.Elements () let mode = (FilterMode)Enum.Parse (typeof (FilterMode), rule.Name.LocalName) let impl = (value = (string)rule.Attribute ("implementation")) != null ? (ImplementationType)Enum.Parse (typeof (ImplementationType), value) : ImplementationType.@class - select new Filter { TypeName = rule.Value, Mode = mode, ImplType = impl }; + select new Filter { TypeName = rule.Value, Mode = mode, ImplType = impl }; return rules.ToDictionary (r => r.TypeName); diff --git a/src/generator/Generator.cs b/src/generator/Generator.cs index 35a08122..95b1a336 100644 --- a/src/generator/Generator.cs +++ b/src/generator/Generator.cs @@ -5,6 +5,7 @@ using System; using System.IO; +using System.Diagnostics; using System.Collections.Generic; using System.Xml; using System.Xml.Linq; @@ -18,24 +19,24 @@ using Mono.Cxxi; public class Generator { // Command line arguments - public string OutputDir { get; set; } - public string Namespace { get; set; } - public string LibBaseName { get; set; } public string InputFileName { get; set; } + public string OutputDir { get; set; } public string FilterFile { get; set; } - public InlineMethods InlinePolicy { get; set; } + + // In the future we might support more than one of these at once... + public Lib Lib { get; set; } // Classes to generate code for - public List Classes { get; set; } - public Dictionary NodeToClass { get; set; } + public Dictionary NodeToNamespace { get; set; } private FilterMode default_filter_mode; public FilterMode DefaultFilterMode { get { return default_filter_mode; } set { default_filter_mode = value; } } public Dictionary Filters { get; set; } // Code templates - public ITemplate Libs { get; set; } - public ITemplate Class { get; set; } + public LibsBase LibsTemplate { get; set; } + public ClassBase ClassTemplate { get; set; } + public EnumBase EnumTemplate { get; set; } public static int Main (String[] args) { var generator = new Generator (); @@ -44,6 +45,9 @@ public class Generator { } void Run (String[] args) { + Lib = new Lib (); + NodeToNamespace = new Dictionary (); + if (ParseArguments (args) != 0) { Environment.Exit (1); } @@ -53,9 +57,9 @@ public class Generator { if (FilterFile != null) Filters = Filter.Load (XDocument.Load (FilterFile), out default_filter_mode); - CreateClasses (root); + CreateTypes (root); - CreateMethods (); + CreateMembers (); GenerateCode (); } @@ -66,10 +70,10 @@ public class Generator { var p = new OptionSet { { "h|?|help", "Show this help message", v => help = v != null }, { "o=|out=", "Set the output directory", v => OutputDir = v }, - { "ns=|namespace=", "Set the namespace of the generated code", v => Namespace = v }, - { "lib=", "The base name of the C++ library, i.e. 'qt' for libqt.so", v =>LibBaseName = v }, + { "ns=|namespace=", "Set the namespace of the generated code", v => Lib.BaseNamespace = v }, + { "lib=", "The base name of the C++ library, i.e. 'qt' for libqt.so", v =>Lib.BaseName = v }, { "filters=", "A file containing filter directives for filtering classes", v => FilterFile = v }, - { "inline=", "Inline methods in lib are: notpresent (default), present, surrogatelib (present in %lib%-inline)", v => InlinePolicy = (InlineMethods)Enum.Parse (typeof (InlineMethods), v, true) } + { "inline=", "Inline methods in lib are: notpresent (default), present, surrogatelib (present in %lib%-inline)", v => Lib.InlinePolicy = (InlineMethods)Enum.Parse (typeof (InlineMethods), v, true) } }; try { @@ -90,16 +94,21 @@ public class Generator { } // Code templates - Libs = new CSharpLibs (); - Class = new CSharpClass (); + LibsTemplate = new CSharpLibs (); + ClassTemplate = new CSharpClass (); + EnumTemplate = new CSharpEnum (); InputFileName = args [0]; - if (LibBaseName == null) { + if (Lib.BaseName == null) { Console.WriteLine ("The --lib= option is required."); return 1; } + if (Lib.BaseNamespace == null) { + Lib.BaseNamespace = Path.GetFileNameWithoutExtension (Lib.BaseName); + } + if (OutputDir == null) OutputDir = "output"; @@ -151,44 +160,104 @@ public class Generator { return root; } - void CreateClasses (Node root) { - List classNodes = root.Children.Where (o => - (o.Type == "Class" || - o.Type == "Struct") && - !(o.IsTrue ("incomplete") || - !o.HasValue ("name") - )).ToList (); + void CreateTypes (Node root) { + + foreach (Node n in root.Children) { + if (n.IsTrue ("incomplete") || !n.HasValue ("name") || n.Attributes ["name"] == "::") + continue; - List classes = new List (); - NodeToClass = new Dictionary (); + Namespace ns; + switch (n.Type) { - foreach (Node n in classNodes) { - var filter = GetFilterOrDefault (n.Name); - if (filter.Mode == FilterMode.Exclude) + case "Class": + case "Struct": + ns = new Class (n); + break; + + case "Enumeration": + ns = new Enumeration (n); + break; + + case "Namespace": + ns = new Namespace (n); + break; + + default: continue; - var klass = new Class (n); - NodeToClass [n] = klass; + } - if (filter.Mode != FilterMode.External) - classes.Add (klass); + NodeToNamespace [n] = ns; + Lib.Namespaces.Add (ns); } - // Compute bases - foreach (Class klass in classes) { + for (var i = 0; i < Lib.Namespaces.Count; i++) { + Namespace ns = Lib.Namespaces [i]; + SetParentNamespace (ns); + + var filter = GetFilterOrDefault (ns); + if (filter.Mode == FilterMode.Exclude) + NodeToNamespace.Remove (ns.Node); + + if (filter.Mode != FilterMode.Include) { + Lib.Namespaces.RemoveAt (i); + i--; + continue; + } + + var klass = ns as Class; + if (klass == null) + continue; + + // Compute bases foreach (Node bn in klass.Node.Children.Where (o => o.Type == "Base")) { - Class baseClass = NodeToClass [bn.NodeForAttr ("type")]; + Class baseClass = NodeToNamespace [bn.NodeForAttr ("type")] as Class; + Debug.Assert (baseClass != null); klass.BaseClasses.Add (baseClass); } } + } - Classes = classes; + void SetParentNamespace (Namespace ns) + { + Namespace parent = null; + if (ns.Node.HasValue ("context") && NodeToNamespace.TryGetValue (Node.IdToNode [ns.Node.Attributes ["context"]], out parent)) + { + SetParentNamespace (parent); + ns.ParentNamespace = parent; + } } - void CreateMethods () { - foreach (Class klass in Classes) { - if (!klass.Node.HasValue ("members")) + void CreateMembers () { + + foreach (var ns in Lib.Namespaces) { + + var parentClass = ns.ParentNamespace as Class; + + var @enum = ns as Enumeration; + if (@enum != null) { + if (parentClass != null) + parentClass.NestedEnums.Add (@enum); + + foreach (var enumValue in @enum.Node.Children.Where (o => o.Type == "EnumValue")) { + int val; + var item = new Enumeration.Item { Name = enumValue.Attributes ["name"] }; + + if (enumValue.HasValue ("init") && int.TryParse (enumValue.Attributes ["init"], out val)) + item.Value = val; + + @enum.Items.Add (item); + } + continue; + } + + var klass = ns as Class; + if (klass == null || !klass.Node.HasValue ("members")) + continue; + + if (parentClass != null) + parentClass.NestedClasses.Add (klass); int fieldCount = 0; foreach (Node n in klass.Node ["members"].Split (new[] {' '}, StringSplitOptions.RemoveEmptyEntries).Select (id => Node.IdToNode [id])) { @@ -198,7 +267,7 @@ public class Generator { switch (n.Type) { case "Field": - CppType fieldType = GetType (GetTypeNode (n)); + var fieldType = GetType (GetTypeNode (n)); if (fieldType.ElementType == CppTypes.Unknown && fieldType.ElementTypeName == null) fieldType = new CppType (CppTypes.Void, CppModifiers.Pointer); @@ -210,6 +279,7 @@ public class Generator { klass.Fields.Add (new Field (fieldName, fieldType, (Access)Enum.Parse (typeof (Access), n ["access"]))); break; + case "Constructor": ctor = true; break; @@ -222,20 +292,21 @@ public class Generator { continue; } + if (n.Name == "timerEvent") + Console.WriteLine ("foo"); + if ((!dtor && n.HasValue ("overrides") && CheckPrimaryBases (klass, b => b.Node.CheckValueList ("members", n.Attributes ["overrides"]))) || // excl. virtual methods from primary base (except dtor) (!n.IsTrue ("extern") && !n.IsTrue ("inline"))) continue; - if (!n.CheckValue ("access", "public")) // exclude non-public methods - skip = true; - - if (n.IsTrue ("inline") && InlinePolicy == InlineMethods.NotPresent) + if (n.IsTrue ("inline") && Lib.InlinePolicy == InlineMethods.NotPresent) skip = true; string name = dtor ? "Destruct" : n.Name; var method = new Method (n) { Name = name, + Access = (Access)Enum.Parse (typeof (Access), n.Attributes ["access"]), IsVirtual = n.IsTrue ("virtual"), IsStatic = n.IsTrue ("static"), IsConst = n.IsTrue ("const"), @@ -245,6 +316,9 @@ public class Generator { IsDestructor = dtor }; + if (method.Access == Access.@private) + skip = true; + if (dtor || method.IsArtificial) method.GenWrapperMethod = false; @@ -266,7 +340,7 @@ public class Generator { method.ReturnType = retType; int c = 0; - List argTypes = new List (); + var argTypes = new List (); foreach (Node arg in n.Children.Where (o => o.Type == "Argument")) { string argname; if (arg.Name == null || arg.Name == "") @@ -274,7 +348,7 @@ public class Generator { else argname = arg.Name; - CppType argtype = GetType (GetTypeNode (arg)); + var argtype = GetType (GetTypeNode (arg)); if (argtype.ElementType == CppTypes.Unknown) { //Console.WriteLine ("Skipping method " + klass.Name + "::" + member.Name + " () because it has an argument with unknown type '" + TypeNodeToString (arg) + "'."); argtype = new CppType (CppTypes.Void, CppModifiers.Pointer); @@ -306,8 +380,8 @@ public class Generator { klass.Methods.Add (method); } - foreach (Method method in klass.Methods) { - if (AddAsQtProperty (klass, method)) + foreach (var method in klass.Methods) { + if (AddAsProperty (klass, method)) method.GenWrapperMethod = false; } @@ -321,9 +395,8 @@ public class Generator { // // Property support - // This is QT specific // - bool AddAsQtProperty (Class klass, Method method) { + bool AddAsProperty (Class klass, Method method) { // if it's const, returns a value, has no parameters, and there is no other method with the same name // in this class assume it's a property getter (for now?) if (method.IsConst && !method.ReturnType.Equals (CppTypes.Void) && !method.Parameters.Any () && @@ -393,6 +466,8 @@ public class Generator { } CppType GetType (Node n, CppType modifiers) { + var fundamental = CppTypes.Unknown; + switch (n.Type) { case "Typedef": return GetType (GetTypeNode (n), modifiers); @@ -410,15 +485,24 @@ public class Generator { else throw new NotImplementedException (); case "Class": + fundamental = CppTypes.Class; + break; case "Struct": - if (!NodeToClass.ContainsKey (n)) { - // FIXME: Do something better - return CppTypes.Unknown; - } - return modifiers.CopyTypeFrom (new CppType (n.Type == "Class"? CppTypes.Class : CppTypes.Struct, NodeToClass [n].Name)); + fundamental = CppTypes.Struct; + break; + case "Enumeration": + fundamental = CppTypes.Enum; + break; default: return CppTypes.Unknown; } + + if (!NodeToNamespace.ContainsKey (n)) { + // FIXME: Do something better + return CppTypes.Unknown; + } + + return modifiers.CopyTypeFrom (new CppType (fundamental, NodeToNamespace [n].FullyQualifiedName)); } Node GetTypeNode (Node n) { @@ -438,13 +522,15 @@ public class Generator { case CppTypes.Class: case CppTypes.Struct: - // FIXME: Full name + case CppTypes.Enum: - var filter = GetFilterOrDefault (t.ElementTypeName); - if (filter.ImplType == ImplementationType.@struct) - return t.ElementTypeName + "&"; + var filter = GetFilterOrDefault (t); + var qname = filter.TypeName.Replace ("::", "."); + + if (filter.ImplType == ImplementationType.@struct && !IsByVal (t)) + return qname + "&"; else - return t.ElementTypeName; + return qname; } @@ -456,30 +542,77 @@ public class Generator { // Generate Libs file using (TextWriter w = File.CreateText (Path.Combine (OutputDir, "Libs.cs"))) { - Libs.Generator = this; - w.Write (Libs.TransformText ()); + LibsTemplate.Generator = this; + LibsTemplate.Libs = new[] { Lib }; + w.Write (LibsTemplate.TransformText ()); } - // Generate user classes - foreach (Class klass in Classes) { - if (klass.Disable) + // Generate user types + foreach (Namespace ns in Lib.Namespaces) { + if (ns.ParentNamespace is Class) continue; - using (TextWriter w = File.CreateText (Path.Combine (OutputDir, klass.Name + ".cs"))) { - Class.Generator = this; - Class.Class = klass; - w.Write (Class.TransformText ()); + var klass = ns as Class; + if (klass != null) { + if (klass.Disable) + continue; + + using (TextWriter w = File.CreateText (Path.Combine (OutputDir, klass.Name + ".cs"))) { + ClassTemplate.Generator = this; + ClassTemplate.Class = klass; + ClassTemplate.Nested = false; + w.Write (ClassTemplate.TransformText ()); + } + + continue; } + + var @enum = ns as Enumeration; + if (@enum != null) { + + using (TextWriter w = File.CreateText (Path.Combine (OutputDir, @enum.Name + ".cs"))) { + EnumTemplate.Generator = this; + EnumTemplate.Enum = @enum; + EnumTemplate.Nested = false; + w.Write (EnumTemplate.TransformText ()); + } + + continue; + } + } } - Filter GetFilterOrDefault (string typeName) + static public bool IsByVal (CppType t) + { + return ((t.ElementType == CppTypes.Class || t.ElementType == CppTypes.Struct) && + !t.Modifiers.Contains (CppModifiers.Pointer) && + !t.Modifiers.Contains (CppModifiers.Reference) && + !t.Modifiers.Contains (CppModifiers.Array)); + } + + Filter GetFilterOrDefault (Namespace ns) + { + return GetFilterOrDefault (ns.FullyQualifiedName); + } + + Filter GetFilterOrDefault (CppType cpptype) + { + var fqn = cpptype.ElementTypeName; + if (cpptype.Namespaces != null) + fqn = string.Join ("::", cpptype.Namespaces) + "::" + fqn; + + var newtype = new CppType (fqn, cpptype.Modifiers.Where (m => m == CppModifiers.Template)); + return GetFilterOrDefault (newtype.ToString ().Replace (" ", "")); + } + + Filter GetFilterOrDefault (string fqn) { Filter result; - if (Filters != null && Filters.TryGetValue (typeName, out result)) + if (Filters != null && Filters.TryGetValue (fqn, out result)) return result; - return new Filter { TypeName = typeName, Mode = default_filter_mode }; + return new Filter { TypeName = fqn, Mode = default_filter_mode }; } } diff --git a/src/generator/Lib.cs b/src/generator/Lib.cs new file mode 100644 index 00000000..579074d1 --- /dev/null +++ b/src/generator/Lib.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; + +using Mono.Cxxi; + +public class Lib { + + public Lib () + { + Namespaces = new List (); + } + + public string BaseName { + get; + set; + } + + public InlineMethods InlinePolicy { + get; + set; + } + + public string BaseNamespace { + get; + set; + } + + public IList Namespaces { + get; + set; + } +} + diff --git a/src/generator/Makefile.am b/src/generator/Makefile.am index 34b7d887..c446f5d7 100644 --- a/src/generator/Makefile.am +++ b/src/generator/Makefile.am @@ -50,10 +50,13 @@ all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) FILES = \ Access.cs \ Class.cs \ + Enumeration.cs \ Field.cs \ Filter.cs \ Generator.cs \ + Lib.cs \ Method.cs \ + Namespace.cs \ Node.cs \ Options.cs \ Parameter.cs \ @@ -62,6 +65,7 @@ FILES = \ Templates/BaseMembers.cs \ Templates/Context.cs \ Templates/CSharp/CSharpClass.cs \ + Templates/CSharp/CSharpEnum.cs \ Templates/CSharp/CSharpLanguage.cs \ Templates/CSharp/CSharpLibs.cs diff --git a/src/generator/Method.cs b/src/generator/Method.cs index be1e7452..d183c775 100644 --- a/src/generator/Method.cs +++ b/src/generator/Method.cs @@ -44,6 +44,10 @@ public class Method { get; set; } + public Access Access { + get; set; + } + public string Name { get; set; } diff --git a/src/generator/Namespace.cs b/src/generator/Namespace.cs new file mode 100644 index 00000000..0be14207 --- /dev/null +++ b/src/generator/Namespace.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; + +public class Namespace { + + public Namespace (string name) + { + this.Name = name; + } + + public Namespace (Node node) + : this (node.Name) + { + this.Node = node; + } + + public Node Node { + get; set; + } + + // Back ref to enclosing namespace (may be null) + public Namespace ParentNamespace { + get; set; + } + + public string Name { + get; set; + } + + public string FullyQualifiedName { + get { + return ParentNamespace != null? ParentNamespace.FullyQualifiedName + "::" + Name : Name; + } + } + +} + diff --git a/src/generator/Templates/BaseMembers.cs b/src/generator/Templates/BaseMembers.cs index 7e4536a2..345ea2a1 100644 --- a/src/generator/Templates/BaseMembers.cs +++ b/src/generator/Templates/BaseMembers.cs @@ -1,16 +1,36 @@ using System; +using System.Collections.Generic; namespace Templates { - public interface ITemplate { + public interface ITemplate { Generator Generator { get; set; } - Class Class { get; set; } + T Current { get; set; } + bool Nested { get; set; } string TransformText (); } - public partial class Base : ITemplate { + public partial class LibsBase : Base, ITemplate> { public Generator Generator { get; set; } - public Class Class { get; set; } + public ICollection Current { get; set; } + public bool Nested { get; set; } + public ICollection Libs { get { return Current; } set { Current = value; } } + } + + public partial class ClassBase : Base, ITemplate { + + public Generator Generator { get; set; } + public Class Current { get; set; } + public bool Nested { get; set; } + public Class Class { get { return Current; } set { Current = value; } } + } + + public partial class EnumBase : Base, ITemplate { + + public Generator Generator { get; set; } + public Enumeration Current { get; set; } + public bool Nested { get; set; } + public Enumeration Enum { get { return Current; } set { Current = value; } } } } diff --git a/src/generator/Templates/CSharp/CSharpClass.cs b/src/generator/Templates/CSharp/CSharpClass.cs index 328ac657..a8fcc6c2 100644 --- a/src/generator/Templates/CSharp/CSharpClass.cs +++ b/src/generator/Templates/CSharp/CSharpClass.cs @@ -16,10 +16,10 @@ namespace Templates { using System; - public partial class CSharpClass : Base { + public partial class CSharpClass : ClassBase { - #line 288 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 315 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" private void WriteMethodHeader (Method method, string layoutClass, bool isNonPrimaryOverride, bool @protected) { @@ -28,7 +28,7 @@ private void WriteMethodHeader (Method method, string layoutClass, bool isNonPri if (!isNonPrimaryOverride && method.IsVirtual) WriteLine ("[OverrideNative (\"{0}\")]", method.Name); - Write (CurrentIndent + (@protected? "protected " : "public ")); + Write (CurrentIndent + (@protected? "protected" : method.Access.ToString ()) + " "); if (method.IsConstructor) { Write (method.FormattedName); } else { @@ -69,7 +69,7 @@ private void WriteParameters (IList parameters, bool writeType, bool var mangleAs = parameters [i].Type.ToString (); if (mangleAs != "" && mangleAs != type) Write ("[MangleAs (\"{0}\")] ", mangleAs); - if (IsByVal (parameters [i].Type)) + if (Generator.IsByVal (parameters [i].Type)) Write ("[ByVal] "); } @@ -98,13 +98,6 @@ private string GetBaseString () return str; } -private bool IsByVal (CppType t) -{ - return ((t.ElementType == CppTypes.Class || t.ElementType == CppTypes.Struct) && - !t.Modifiers.Contains (CppModifiers.Pointer) && - !t.Modifiers.Contains (CppModifiers.Reference) && - !t.Modifiers.Contains (CppModifiers.Array)); -} #line default #line hidden @@ -121,198 +114,213 @@ private bool IsByVal (CppType t) var layoutClass = (hasBase? "\t: base (impl.TypeInfo)\n\t\t{" : "{") + "\n\t\t\t__cxxi_LayoutClass ();"; var overrideInitBases = Generator.CheckPrimaryBases (Class, c => c.BaseClasses.Count > 1); var initBases = ((overrideInitBases || Class.BaseClasses.Count > 1) ? "\t__cxxi_InitBases ();\n\t\t}" : "}"); + var @namespace = Generator.Lib.BaseNamespace + (Class.ParentNamespace != null? "." + Class.ParentNamespace.FullyQualifiedName : ""); + +if (!Nested) { #line default #line hidden - #line 15 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 18 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("// -------------------------------------------------------------------------\n// Managed wrapper for "); #line default #line hidden - #line 16 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 19 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( Class.Name )); #line default #line hidden - #line 16 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 19 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n// Generated from "); #line default #line hidden - #line 17 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 20 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( Path.GetFileName (Generator.InputFileName) )); #line default #line hidden - #line 17 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 20 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" on "); #line default #line hidden - #line 17 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 20 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( DateTime.Now )); #line default #line hidden - #line 17 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 20 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n//\n// This file was auto generated. Do not edit.\n// -------------------------------------------------------------------------\n\nusing System;\nusing Mono.Cxxi;\n\nnamespace "); #line default #line hidden - #line 25 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" - this.Write(this.ToStringHelper.ToStringWithCulture( Generator.Namespace )); + #line 28 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( @namespace )); + + #line default + #line hidden + + #line 28 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + this.Write(" {\n"); #line default #line hidden - #line 25 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" - this.Write(" {\n\n\tpublic partial class "); + #line 29 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + } /* if !Nested */ #line default #line hidden - #line 27 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 30 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + this.Write("\tpublic partial class "); + + #line default + #line hidden + + #line 30 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 27 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 30 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" : "); #line default #line hidden - #line 27 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 30 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( GetBaseString () )); #line default #line hidden - #line 27 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 30 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" {\n\n\t\tprivate static readonly "); #line default #line hidden - #line 29 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 32 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( iface )); #line default #line hidden - #line 29 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 32 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" impl = Libs."); #line default #line hidden - #line 29 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" - this.Write(this.ToStringHelper.ToStringWithCulture( Generator.LibBaseName )); + #line 32 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( Generator.Lib.BaseName )); #line default #line hidden - #line 29 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 32 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(".GetClass<"); #line default #line hidden - #line 29 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 32 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( iface + "," + layout + "," + wrapper )); #line default #line hidden - #line 29 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 32 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("> (\""); #line default #line hidden - #line 29 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 32 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( Class.Name )); #line default #line hidden - #line 29 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 32 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\");\n"); #line default #line hidden - #line 30 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 33 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" if (!hasBase) { #line default #line hidden - #line 31 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 34 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\tpublic CppInstancePtr Native { get; protected set; }\n"); #line default #line hidden - #line 32 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 35 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" } #line default #line hidden - #line 33 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 36 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n"); #line default #line hidden - #line 34 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 37 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" /* Interface */ #line default #line hidden - #line 35 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 38 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\tpublic partial interface "); #line default #line hidden - #line 35 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 38 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( iface )); #line default #line hidden - #line 35 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 38 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" : ICppClassOverridable<"); #line default #line hidden - #line 35 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 38 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 35 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 38 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("> {\n"); #line default #line hidden - #line 36 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 39 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" PushIndent ("\t\t\t"); foreach (var method in Class.Methods) { Write (CurrentIndent); @@ -326,7 +334,7 @@ private bool IsByVal (CppType t) if (method.IsDestructor) Write ("[Destructor] "); if (method.IsCopyCtor) Write ("[CopyConstructor] "); - if (IsByVal (method.ReturnType)) { + if (Generator.IsByVal (method.ReturnType)) { Write ("[return: ByVal] "); } if (method.IsConstructor) @@ -349,96 +357,96 @@ private bool IsByVal (CppType t) foreach (var field in Class.Fields.Where (f => f.Access != Access.@private)) { WriteLine ("CppField<{0}> {1} {{ get; }}", CSharpLanguage.TypeName (Generator.CppTypeToManaged (field.Type), Context.Generic), CSharpLanguage.SafeIdentifier (field.Name)); } - ClearIndent (); + PopIndent (); #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" this.Write("\t\t}\n"); #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" /* Native layout */ #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" this.Write("\t\tprivate struct "); #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" this.Write(this.ToStringHelper.ToStringWithCulture( layout )); #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" this.Write(" {\n"); #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" foreach (var field in Class.Fields) { #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" this.Write("\t\t\tpublic "); #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" this.Write(this.ToStringHelper.ToStringWithCulture( CSharpLanguage.TypeName (Generator.CppTypeToManaged (field.Type), Context.Generic) )); #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" this.Write(" "); #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" this.Write(this.ToStringHelper.ToStringWithCulture( CSharpLanguage.SafeIdentifier (field.Name) )); #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" this.Write(";\n"); #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" } #line default #line hidden - #line 79 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 82 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\t}\n\n"); #line default #line hidden - #line 81 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 84 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" /* Native fields */ #line default #line hidden - #line 82 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 85 "/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)) { var fieldName = CSharpLanguage.SafeIdentifier (field.Name); @@ -447,139 +455,191 @@ private bool IsByVal (CppType t) #line default #line hidden - #line 86 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 89 "/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 87 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 90 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( fieldName )); #line default #line hidden - #line 87 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 90 "/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 90 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 93 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( fieldName )); #line default #line hidden - #line 90 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 93 "/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 93 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" - } ClearIndent(); + #line 96 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + } PopIndent(); #line default #line hidden - #line 94 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 97 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n"); #line default #line hidden - #line 95 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 98 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + /* Nested classes */ + + #line default + #line hidden + + #line 99 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + foreach (var klass in Class.NestedClasses) { + var oldClass = this.Class; + var wasNested = this.Nested; + + this.Class = klass; + this.Nested = true; + + Write (this.TransformText ()); + + this.Class = oldClass; + this.Nested = wasNested; +} + + #line default + #line hidden + + #line 111 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + this.Write("\n"); + + #line default + #line hidden + + #line 112 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + /* Nested enums */ + + #line default + #line hidden + + #line 113 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + foreach (var @enum in Class.NestedEnums) { + Generator.EnumTemplate.Generator = Generator; + Generator.EnumTemplate.Enum = @enum; + Generator.EnumTemplate.Nested = true; + Write (Generator.EnumTemplate.TransformText ()); +} + + #line default + #line hidden + + #line 119 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + this.Write("\n"); + + #line default + #line hidden + + #line 120 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" /* Subclass constructor */ #line default #line hidden - #line 96 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 121 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\tpublic "); #line default #line hidden - #line 96 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 121 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 96 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 121 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" (CppTypeInfo subClass)\n\t\t"); #line default #line hidden - #line 97 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 122 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( layoutClass )); #line default #line hidden - #line 97 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 122 "/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 101 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 126 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" /* Native constructor */ #line default #line hidden - #line 102 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 127 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\tpublic "); #line default #line hidden - #line 102 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 127 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 102 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 127 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" (CppInstancePtr native)\n\t\t"); #line default #line hidden - #line 103 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 128 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( layoutClass )); #line default #line hidden - #line 103 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 128 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n\t\t\tNative = native;\n\t\t"); #line default #line hidden - #line 105 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 130 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( initBases )); #line default #line hidden - #line 105 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 130 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n\n"); #line default #line hidden - #line 107 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 132 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" /* Wrapper methods */ #line default #line hidden - #line 108 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 133 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" PushIndent ("\t\t"); foreach (var method in Class.Methods.Where (m => m.GenWrapperMethod)) { var methodName = CSharpLanguage.SafeIdentifier (method.Name); @@ -607,24 +667,24 @@ private bool IsByVal (CppType t) else WriteLine ("}"); } - ClearIndent (); + PopIndent (); #line default #line hidden - #line 136 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 161 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n"); #line default #line hidden - #line 137 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 162 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" /* Wrapper properties */ #line default #line hidden - #line 138 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 163 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" PushIndent ("\t\t"); foreach (var prop in Class.Properties) { var propName = CSharpLanguage.SafeIdentifier (prop.Name); @@ -668,223 +728,223 @@ private bool IsByVal (CppType t) PopIndent (); WriteLine ("}\n"); } - ClearIndent (); + PopIndent (); #line default #line hidden - #line 182 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 207 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n\t\tpartial void BeforeDestruct ();\n\t\tpartial void AfterDestruct ();\n\n\t\tpublic "); #line default #line hidden - #line 186 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 211 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( hasBase? "override" : "virtual" )); #line default #line hidden - #line 186 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 211 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" void Dispose ()\n\t\t{\n\t\t\tBeforeDestruct ();\n"); #line default #line hidden - #line 189 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 214 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" if (Class.Methods.Any (m => m.IsDestructor && !m.IsArtificial)) { #line default #line hidden - #line 190 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 215 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\t\timpl.Destruct (Native);\n"); #line default #line hidden - #line 191 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 216 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" } #line default #line hidden - #line 192 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 217 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\t\tNative.Dispose ();\n\t\t\tAfterDestruct ();\n\t\t}\n\n\t\tprivate void __cxxi_LayoutClass ()\n\t\t{\n"); #line default #line hidden - #line 198 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 223 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" foreach (var npBase in Class.BaseClasses.Skip (1)) { #line default #line hidden - #line 199 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 224 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\t\tnew "); #line default #line hidden - #line 199 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 224 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 199 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 224 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" (impl.TypeInfo);\n"); #line default #line hidden - #line 200 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 225 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" } #line default #line hidden - #line 201 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 226 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\t\timpl.TypeInfo.CompleteType ();\n\t\t}\n\n"); #line default #line hidden - #line 204 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 229 "/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)) { #line default #line hidden - #line 206 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 231 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n#region Non-primary base class implementation for "); #line default #line hidden - #line 207 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 232 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 207 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 232 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n\t\tprivate class "); #line default #line hidden - #line 208 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 233 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper + "__" + npBase.Name )); #line default #line hidden - #line 208 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 233 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" : "); #line default #line hidden - #line 208 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 233 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 208 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 233 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" {\n\t\t\tpublic "); #line default #line hidden - #line 209 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 234 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 209 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 234 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" instance;\n\t\t\tpublic "); #line default #line hidden - #line 210 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 235 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper + "__" + npBase.Name )); #line default #line hidden - #line 210 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 235 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" ("); #line default #line hidden - #line 210 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 235 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 210 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 235 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" instance)\n\t\t\t\t: base ("); #line default #line hidden - #line 211 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 236 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 211 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 236 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(".impl.TypeInfo.Cast (instance, typeof ("); #line default #line hidden - #line 211 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 236 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 211 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 236 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(")))\n\t\t\t{\n\t\t\t\t"); #line default #line hidden - #line 213 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 238 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 213 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 238 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(".impl.TypeInfo.InitNonPrimaryBase (this, instance, typeof ("); #line default #line hidden - #line 213 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 238 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 213 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 238 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("));\n\t\t\t\tthis.instance = instance;\n\t\t\t}\n\n"); #line default #line hidden - #line 217 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 242 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" PushIndent ("\t\t\t"); foreach (var method in npBase.Methods.Where (m => m.IsVirtual)) { @@ -909,168 +969,168 @@ foreach (var npBase in Class.BaseClasses.Skip (1)) { PopIndent (); Write (");\n{0}}}\n\n", CurrentIndent); } - ClearIndent (); + PopIndent (); #line default #line hidden - #line 242 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 267 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\t}\n\t\tprivate "); #line default #line hidden - #line 243 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 268 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 243 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 268 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("__"); #line default #line hidden - #line 243 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 268 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 243 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 268 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" __cxxi_"); #line default #line hidden - #line 243 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 268 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 243 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 268 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(";\n\t\tpublic "); #line default #line hidden - #line 244 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 269 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 244 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 269 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" "); #line default #line hidden - #line 244 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 269 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 244 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 269 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" { get { return __cxxi_"); #line default #line hidden - #line 244 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 269 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 244 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 269 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("; } }\n\t\tpublic static implicit operator "); #line default #line hidden - #line 245 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 270 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 245 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 270 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("("); #line default #line hidden - #line 245 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 270 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 245 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 270 "/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 247 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 272 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 247 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 272 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(";\n\t\t}\n\t\tpublic static explicit operator "); #line default #line hidden - #line 249 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 274 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 249 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 274 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("("); #line default #line hidden - #line 249 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 274 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 249 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 274 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" baseClass)\n\t\t{\n\t\t\tif (baseClass == null) return null;\n\t\t\tvar obj = baseClass as "); #line default #line hidden - #line 252 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 277 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper + "__" + npBase.Name )); #line default #line hidden - #line 252 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 277 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(";\n\t\t\tif (obj == null) throw new InvalidCastException ();\n\t\t\treturn obj.instance;\n\t\t}\n\n"); #line default #line hidden - #line 257 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 282 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" /* Add virtual methods of non-primary bases to this class proper so they can be overridden */ #line default #line hidden - #line 258 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 283 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" PushIndent ("\t\t"); foreach (var method in npBase.Methods.Where (m => m.IsVirtual)) { @@ -1085,7 +1145,7 @@ foreach (var npBase in Class.BaseClasses.Skip (1)) { PopIndent (); Write (");\n{0}}}\n\n", CurrentIndent); } - ClearIndent (); + PopIndent (); WriteLine ("#endregion"); } @@ -1094,92 +1154,116 @@ if (overrideInitBases || Class.BaseClasses.Count > 1) { #line default #line hidden - #line 277 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 302 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\tprotected "); #line default #line hidden - #line 277 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 302 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( overrideInitBases ? "override" : "virtual" )); #line default #line hidden - #line 277 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 302 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" void __cxxi_InitBases ()\n\t\t{\n\t\t\t"); #line default #line hidden - #line 279 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 304 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( overrideInitBases? "base.__cxxi_InitBases ();" : "" )); #line default #line hidden - #line 279 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 304 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n"); #line default #line hidden - #line 280 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 305 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" foreach (var npBase in Class.BaseClasses.Skip (1)) { #line default #line hidden - #line 281 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 306 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\t\t__cxxi_"); #line default #line hidden - #line 281 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 306 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 281 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 306 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" = new "); #line default #line hidden - #line 281 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 306 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper + "__" + npBase.Name )); #line default #line hidden - #line 281 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 306 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" (this);\n"); #line default #line hidden - #line 282 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 307 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" } #line default #line hidden - #line 283 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 308 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\t}\n"); #line default #line hidden - #line 284 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 309 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" } #line default #line hidden - #line 285 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" - this.Write("\t}\n}\n\n"); + #line 310 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + this.Write("\t}\n"); + + #line default + #line hidden + + #line 311 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + if (!Nested) { + + #line default + #line hidden + + #line 312 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + this.Write("}\n"); + + #line default + #line hidden + + #line 313 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + } + + #line default + #line hidden + + #line 314 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + this.Write("\n"); #line default #line hidden diff --git a/src/generator/Templates/CSharp/CSharpClass.tt b/src/generator/Templates/CSharp/CSharpClass.tt index a3081426..6c22352f 100644 --- a/src/generator/Templates/CSharp/CSharpClass.tt +++ b/src/generator/Templates/CSharp/CSharpClass.tt @@ -1,4 +1,4 @@ -<#@ template language="C#" inherits="Base" #> +<#@ template language="C#" inherits="ClassBase" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Collections.Generic" #> @@ -11,6 +11,9 @@ var layoutClass = (hasBase? "\t: base (impl.TypeInfo)\n\t\t{" : "{") + "\n\t\t\t__cxxi_LayoutClass ();"; var overrideInitBases = Generator.CheckPrimaryBases (Class, c => c.BaseClasses.Count > 1); var initBases = ((overrideInitBases || Class.BaseClasses.Count > 1) ? "\t__cxxi_InitBases ();\n\t\t}" : "}"); + var @namespace = Generator.Lib.BaseNamespace + (Class.ParentNamespace != null? "." + Class.ParentNamespace.FullyQualifiedName : ""); + +if (!Nested) { #> // ------------------------------------------------------------------------- // Managed wrapper for <#= Class.Name #> @@ -22,11 +25,11 @@ using System; using Mono.Cxxi; -namespace <#= Generator.Namespace #> { - +namespace <#= @namespace #> { +<# } /* if !Nested */ #> public partial class <#= wrapper #> : <#= GetBaseString () #> { - private static readonly <#= iface #> impl = Libs.<#= Generator.LibBaseName #>.GetClass<<#= iface + "," + layout + "," + wrapper #>> ("<#= Class.Name #>"); + private static readonly <#= iface #> impl = Libs.<#= Generator.Lib.BaseName #>.GetClass<<#= iface + "," + layout + "," + wrapper #>> ("<#= Class.Name #>"); <# if (!hasBase) { #> public CppInstancePtr Native { get; protected set; } <# } #> @@ -46,7 +49,7 @@ namespace <#= Generator.Namespace #> { if (method.IsDestructor) Write ("[Destructor] "); if (method.IsCopyCtor) Write ("[CopyConstructor] "); - if (IsByVal (method.ReturnType)) { + if (Generator.IsByVal (method.ReturnType)) { Write ("[return: ByVal] "); } if (method.IsConstructor) @@ -69,7 +72,7 @@ namespace <#= Generator.Namespace #> { foreach (var field in Class.Fields.Where (f => f.Access != Access.@private)) { WriteLine ("CppField<{0}> {1} {{ get; }}", CSharpLanguage.TypeName (Generator.CppTypeToManaged (field.Type), Context.Generic), CSharpLanguage.SafeIdentifier (field.Name)); } - ClearIndent (); #> + PopIndent (); #> } <# /* Native layout */ #> private struct <#= layout #> { @@ -90,7 +93,29 @@ namespace <#= Generator.Namespace #> { impl.<#= fieldName #> [Native] = value; } } -<# } ClearIndent(); #> +<# } PopIndent(); #> + +<# /* Nested classes */ #> +<# foreach (var klass in Class.NestedClasses) { + var oldClass = this.Class; + var wasNested = this.Nested; + + this.Class = klass; + this.Nested = true; + + Write (this.TransformText ()); + + this.Class = oldClass; + this.Nested = wasNested; +} #> + +<# /* Nested enums */ #> +<# foreach (var @enum in Class.NestedEnums) { + Generator.EnumTemplate.Generator = Generator; + Generator.EnumTemplate.Enum = @enum; + Generator.EnumTemplate.Nested = true; + Write (Generator.EnumTemplate.TransformText ()); +} #> <# /* Subclass constructor */ #> public <#= wrapper #> (CppTypeInfo subClass) @@ -132,7 +157,7 @@ namespace <#= Generator.Namespace #> { else WriteLine ("}"); } - ClearIndent (); #> + PopIndent (); #> <# /* Wrapper properties */ #> <# PushIndent ("\t\t"); @@ -178,7 +203,7 @@ namespace <#= Generator.Namespace #> { PopIndent (); WriteLine ("}\n"); } - ClearIndent (); #> + PopIndent (); #> partial void BeforeDestruct (); partial void AfterDestruct (); @@ -238,7 +263,7 @@ foreach (var npBase in Class.BaseClasses.Skip (1)) { #> PopIndent (); Write (");\n{0}}}\n\n", CurrentIndent); } - ClearIndent (); #> + PopIndent (); #> } private <#= wrapper #>__<#= npBase.Name #> __cxxi_<#= npBase.Name #>; public <#= npBase.Name #> <#= npBase.Name #> { get { return __cxxi_<#= npBase.Name #>; } } @@ -269,7 +294,7 @@ foreach (var npBase in Class.BaseClasses.Skip (1)) { #> PopIndent (); Write (");\n{0}}}\n\n", CurrentIndent); } - ClearIndent (); + PopIndent (); WriteLine ("#endregion"); } @@ -283,7 +308,9 @@ if (overrideInitBases || Class.BaseClasses.Count > 1) { #> } <# } #> } +<# if (!Nested) { #> } +<# } #> <#+ private void WriteMethodHeader (Method method, string layoutClass, bool isNonPrimaryOverride, bool @protected) @@ -293,7 +320,7 @@ private void WriteMethodHeader (Method method, string layoutClass, bool isNonPri if (!isNonPrimaryOverride && method.IsVirtual) WriteLine ("[OverrideNative (\"{0}\")]", method.Name); - Write (CurrentIndent + (@protected? "protected " : "public ")); + Write (CurrentIndent + (@protected? "protected" : method.Access.ToString ()) + " "); if (method.IsConstructor) { Write (method.FormattedName); } else { @@ -334,7 +361,7 @@ private void WriteParameters (IList parameters, bool writeType, bool var mangleAs = parameters [i].Type.ToString (); if (mangleAs != "" && mangleAs != type) Write ("[MangleAs (\"{0}\")] ", mangleAs); - if (IsByVal (parameters [i].Type)) + if (Generator.IsByVal (parameters [i].Type)) Write ("[ByVal] "); } @@ -363,11 +390,4 @@ private string GetBaseString () return str; } -private bool IsByVal (CppType t) -{ - return ((t.ElementType == CppTypes.Class || t.ElementType == CppTypes.Struct) && - !t.Modifiers.Contains (CppModifiers.Pointer) && - !t.Modifiers.Contains (CppModifiers.Reference) && - !t.Modifiers.Contains (CppModifiers.Array)); -} #> \ No newline at end of file diff --git a/src/generator/Templates/CSharp/CSharpEnum.cs b/src/generator/Templates/CSharp/CSharpEnum.cs new file mode 100644 index 00000000..ad5fd684 --- /dev/null +++ b/src/generator/Templates/CSharp/CSharpEnum.cs @@ -0,0 +1,184 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Mono Runtime Version: 4.0.30319.1 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ + +namespace Templates { + using System.IO; + using System.Linq; + using System.Collections.Generic; + using Mono.Cxxi; + using System; + + + public partial class CSharpEnum : EnumBase { + + public override string TransformText() { + this.GenerationEnvironment = null; + + #line 6 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + + var @namespace = Generator.Lib.BaseNamespace + (Enum.ParentNamespace != null? "." + Enum.ParentNamespace.FullyQualifiedName : ""); + +if (!Nested) { + + + #line default + #line hidden + + #line 11 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write("\n// -------------------------------------------------------------------------\n// Managed enum for "); + + #line default + #line hidden + + #line 13 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( Enum.Name )); + + #line default + #line hidden + + #line 13 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write("\n// Generated from "); + + #line default + #line hidden + + #line 14 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( Path.GetFileName (Generator.InputFileName) )); + + #line default + #line hidden + + #line 14 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write(" on "); + + #line default + #line hidden + + #line 14 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( DateTime.Now )); + + #line default + #line hidden + + #line 14 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write("\n//\n// This file was auto generated. Do not edit.\n// -------------------------------------------------------------------------\n\nnamespace "); + + #line default + #line hidden + + #line 19 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( @namespace )); + + #line default + #line hidden + + #line 19 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write(" {\n"); + + #line default + #line hidden + + #line 20 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + } /* if !Nested */ + + #line default + #line hidden + + #line 21 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write("\tpublic enum "); + + #line default + #line hidden + + #line 21 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( Enum.Name )); + + #line default + #line hidden + + #line 21 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write(" {\n"); + + #line default + #line hidden + + #line 22 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + foreach (var item in Enum.Items) { + + #line default + #line hidden + + #line 23 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write("\t\t"); + + #line default + #line hidden + + #line 23 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( item.Name )); + + #line default + #line hidden + + #line 23 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write(" = "); + + #line default + #line hidden + + #line 23 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( item.Value )); + + #line default + #line hidden + + #line 23 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write(",\n"); + + #line default + #line hidden + + #line 24 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + } + + #line default + #line hidden + + #line 25 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write("\t}\n"); + + #line default + #line hidden + + #line 26 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + if (!Nested) { + + #line default + #line hidden + + #line 27 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + this.Write("}\n"); + + #line default + #line hidden + + #line 28 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpEnum.tt" + } + + #line default + #line hidden + return this.GenerationEnvironment.ToString(); + } + + protected override void Initialize() { + base.Initialize(); + } + } +} diff --git a/src/generator/Templates/CSharp/CSharpEnum.tt b/src/generator/Templates/CSharp/CSharpEnum.tt new file mode 100644 index 00000000..b986d1cb --- /dev/null +++ b/src/generator/Templates/CSharp/CSharpEnum.tt @@ -0,0 +1,28 @@ +<#@ template language="C#" inherits="EnumBase" #> +<#@ import namespace="System.IO" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="Mono.Cxxi" #> +<# + var @namespace = Generator.Lib.BaseNamespace + (Enum.ParentNamespace != null? "." + Enum.ParentNamespace.FullyQualifiedName : ""); + +if (!Nested) { +#> + +// ------------------------------------------------------------------------- +// Managed enum for <#= Enum.Name #> +// Generated from <#= Path.GetFileName (Generator.InputFileName) #> on <#= DateTime.Now #> +// +// This file was auto generated. Do not edit. +// ------------------------------------------------------------------------- + +namespace <#= @namespace #> { +<# } /* if !Nested */ #> + public enum <#= Enum.Name #> { +<# foreach (var item in Enum.Items) { #> + <#= item.Name #> = <#= item.Value #>, +<# } #> + } +<# if (!Nested) { #> +} +<# } #> \ No newline at end of file diff --git a/src/generator/Templates/CSharp/CSharpLanguage.cs b/src/generator/Templates/CSharp/CSharpLanguage.cs index e4cf2f7b..7e1b994f 100644 --- a/src/generator/Templates/CSharp/CSharpLanguage.cs +++ b/src/generator/Templates/CSharp/CSharpLanguage.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using Mono.Cxxi; @@ -24,6 +25,7 @@ namespace Templates { public static string SafeIdentifier (string proposedName) { + proposedName = new string (((IEnumerable)proposedName).Select (c => char.IsLetterOrDigit (c)? c : '_').ToArray ()); return keywords.Contains (proposedName)? "@" + proposedName : proposedName; } diff --git a/src/generator/Templates/CSharp/CSharpLibs.cs b/src/generator/Templates/CSharp/CSharpLibs.cs index 74249c60..70ac7549 100644 --- a/src/generator/Templates/CSharp/CSharpLibs.cs +++ b/src/generator/Templates/CSharp/CSharpLibs.cs @@ -12,13 +12,13 @@ namespace Templates { using System; - public partial class CSharpLibs : Base { + public partial class CSharpLibs : LibsBase { public override string TransformText() { this.GenerationEnvironment = null; #line 2 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpLibs.tt" - this.Write("// -------------------------------------------------------------------------\n// C++ libarary declarations\n// Generated on "); + this.Write("// -------------------------------------------------------------------------\n// C++ library declarations\n// Generated on "); #line default #line hidden @@ -36,19 +36,31 @@ namespace Templates { #line hidden #line 12 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpLibs.tt" - this.Write(this.ToStringHelper.ToStringWithCulture( Generator.Namespace )); + this.Write(this.ToStringHelper.ToStringWithCulture( Generator.Lib.BaseNamespace )); #line default #line hidden #line 12 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpLibs.tt" - this.Write(" {\n\n\tpublic static partial class Libs {\n\n\t\tpublic static readonly CppLibrary "); + this.Write(" {\n\n\tpublic static partial class Libs {\n"); + + #line default + #line hidden + + #line 15 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpLibs.tt" + foreach (var lib in Libs) { + + #line default + #line hidden + + #line 16 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpLibs.tt" + this.Write("\t\tpublic static readonly CppLibrary "); #line default #line hidden #line 16 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpLibs.tt" - this.Write(this.ToStringHelper.ToStringWithCulture( Generator.LibBaseName )); + this.Write(this.ToStringHelper.ToStringWithCulture( CSharpLanguage.SafeIdentifier (lib.BaseName) )); #line default #line hidden @@ -60,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.LibBaseName )); + this.Write(this.ToStringHelper.ToStringWithCulture( lib.BaseName )); #line default #line hidden @@ -72,13 +84,25 @@ namespace Templates { #line hidden #line 16 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpLibs.tt" - this.Write(this.ToStringHelper.ToStringWithCulture( Generator.InlinePolicy )); + this.Write(this.ToStringHelper.ToStringWithCulture( lib.InlinePolicy )); #line default #line hidden #line 16 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpLibs.tt" - this.Write(");\n\n\t}\n}\n"); + this.Write(");\n"); + + #line default + #line hidden + + #line 17 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpLibs.tt" + } + + #line default + #line hidden + + #line 18 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpLibs.tt" + this.Write("\t}\n}\n"); #line default #line hidden diff --git a/src/generator/Templates/CSharp/CSharpLibs.tt b/src/generator/Templates/CSharp/CSharpLibs.tt index 57f94b56..3a065c9f 100644 --- a/src/generator/Templates/CSharp/CSharpLibs.tt +++ b/src/generator/Templates/CSharp/CSharpLibs.tt @@ -1,6 +1,6 @@ -<#@ template language="C#" inherits="Base" #> +<#@ template language="C#" inherits="LibsBase" #> // ------------------------------------------------------------------------- -// C++ libarary declarations +// C++ library declarations // Generated on <#= DateTime.Now #> // // This file was auto generated. Do not edit. @@ -9,11 +9,11 @@ using System; using Mono.Cxxi; -namespace <#= Generator.Namespace #> { +namespace <#= Generator.Lib.BaseNamespace #> { public static partial class Libs { - - public static readonly CppLibrary <#= Generator.LibBaseName #> = new CppLibrary ("<#= Generator.LibBaseName #>", InlineMethods.<#= Generator.InlinePolicy #>); - +<# foreach (var lib in Libs) { #> + public static readonly CppLibrary <#= CSharpLanguage.SafeIdentifier (lib.BaseName) #> = new CppLibrary ("<#= lib.BaseName #>", InlineMethods.<#= lib.InlinePolicy #>); +<# } #> } } diff --git a/src/generator/generator.csproj b/src/generator/generator.csproj index a91040f7..3fc26485 100644 --- a/src/generator/generator.csproj +++ b/src/generator/generator.csproj @@ -72,6 +72,12 @@ + + + + CSharpEnum.tt + + @@ -121,10 +127,6 @@ - - TextTemplatingFilePreprocessor - Base.cs - TextTemplatingFilePreprocessor CSharpClass.cs @@ -133,6 +135,14 @@ TextTemplatingFilePreprocessor CSharpLibs.cs + + TextTemplatingFilePreprocessor + Base.cs + + + TextTemplatingFilePreprocessor + CSharpEnum.cs +