From ee3d4917e851cd82048ec75c806dd59be8e20d14 Mon Sep 17 00:00:00 2001 From: Alex Corrado Date: Mon, 18 Jul 2011 03:07:13 -0400 Subject: [PATCH] Generator cleanup: escape C# keywords when used as identifiers in wrappers --- src/generator/Class.cs | 4 - src/generator/Field.cs | 4 - src/generator/Generator.cs | 2 +- src/generator/Makefile.am | 1 + src/generator/Method.cs | 1 - src/generator/Parameter.cs | 4 - src/generator/Templates/CSharp/CSharpClass.cs | 275 ++++++++---------- src/generator/Templates/CSharp/CSharpClass.tt | 67 ++--- .../Templates/CSharp/CSharpLanguage.cs | 67 +++++ src/generator/generator.csproj | 4 +- 10 files changed, 211 insertions(+), 218 deletions(-) create mode 100644 src/generator/Templates/CSharp/CSharpLanguage.cs diff --git a/src/generator/Class.cs b/src/generator/Class.cs index 77f887ea..19ebe90f 100644 --- a/src/generator/Class.cs +++ b/src/generator/Class.cs @@ -28,11 +28,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. using System; -using System.Linq; using System.Collections.Generic; -using System.Reflection; - -using Templates; public class Class { diff --git a/src/generator/Field.cs b/src/generator/Field.cs index a9bd285a..46f6ac3c 100644 --- a/src/generator/Field.cs +++ b/src/generator/Field.cs @@ -28,10 +28,6 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. using System; -using System.Collections.Generic; -using System.CodeDom; -using System.CodeDom.Compiler; - using Mono.Cxxi; public class Field { diff --git a/src/generator/Generator.cs b/src/generator/Generator.cs index 125a9b5c..cac1d0c1 100644 --- a/src/generator/Generator.cs +++ b/src/generator/Generator.cs @@ -410,7 +410,7 @@ public class Generator { // Return the System.Type name corresponding to T, or null // Returned as a string, because other wrappers do not have System.Types yet - public string CppTypeToManaged (CppType t) { + public static string CppTypeToManaged (CppType t) { Type mtype = t.ToManagedType (); if (mtype != null && mtype != typeof (ICppObject)) { diff --git a/src/generator/Makefile.am b/src/generator/Makefile.am index 00740624..e400939e 100644 --- a/src/generator/Makefile.am +++ b/src/generator/Makefile.am @@ -60,6 +60,7 @@ FILES = \ Templates/Base.cs \ Templates/BaseMembers.cs \ Templates/CSharp/CSharpClass.cs \ + Templates/CSharp/CSharpLanguage.cs \ Templates/CSharp/CSharpLibs.cs DATA_FILES = diff --git a/src/generator/Method.cs b/src/generator/Method.cs index c17a2e29..be1e7452 100644 --- a/src/generator/Method.cs +++ b/src/generator/Method.cs @@ -28,7 +28,6 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. using System; -using System.Linq; using System.Collections.Generic; using Mono.Cxxi; diff --git a/src/generator/Parameter.cs b/src/generator/Parameter.cs index ccfafc71..8c616a92 100644 --- a/src/generator/Parameter.cs +++ b/src/generator/Parameter.cs @@ -23,10 +23,6 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. using System; -using System.Collections.Generic; -using System.CodeDom; -using System.CodeDom.Compiler; - using Mono.Cxxi; public class Parameter diff --git a/src/generator/Templates/CSharp/CSharpClass.cs b/src/generator/Templates/CSharp/CSharpClass.cs index d7275329..d38cf060 100644 --- a/src/generator/Templates/CSharp/CSharpClass.cs +++ b/src/generator/Templates/CSharp/CSharpClass.cs @@ -19,11 +19,11 @@ namespace Templates { public partial class CSharpClass : Base { - #line 278 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 280 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" private void WriteMethodHeader (Method method, string layoutClass, bool isNonPrimaryOverride, bool @protected) { - var returnType = GetCSharpType (method.ReturnType); + var returnType = CSharpLanguage.TypeName (method.ReturnType); if (!isNonPrimaryOverride && method.IsVirtual) WriteLine ("[OverrideNative (\"{0}\")]", method.Name); @@ -63,7 +63,7 @@ private void WriteParameters (IList parameters, bool writeType, bool if (i != 0) Write (", "); - var type = GetCSharpType (parameters [i].Type); + var type = CSharpLanguage.TypeName (parameters [i].Type); if (writeAttributes) { var mangleAs = parameters [i].Type.ToString (); @@ -75,7 +75,7 @@ private void WriteParameters (IList parameters, bool writeType, bool if (type.EndsWith ("&")) { Write ("ref "); - type = GetCSharpType (type.TrimEnd ('&')); + type = CSharpLanguage.TypeName (type.TrimEnd ('&')); } if (writeType) { @@ -83,43 +83,10 @@ private void WriteParameters (IList parameters, bool writeType, bool Write (" "); } - Write (parameters [i].Name); + Write (CSharpLanguage.SafeIdentifier (parameters [i].Name)); } } -private string GetCSharpType (CppType t) -{ - return GetCSharpType (Generator.CppTypeToManaged (t)); -} - -private string GetCSharpType (string str) -{ - switch (str) { - case "System.Void": return "void"; - case "System.Boolean": return "bool"; - case "System.Byte": return "byte"; - case "System.SByte": return "sbyte"; - case "System.Char": return "char"; - case "System.Int16": return "short"; - case "System.UInt16": return "ushort"; - case "System.Decimal": return "decimal"; - case "System.Single": return "float"; - case "System.Double": return "double"; - case "System.Int32": return "int"; - case "System.UInt32": return "uint"; - case "System.Int64": return "long"; - case "System.UInt64": return "ulong"; - case "System.Object": return "object"; - case "System.String": return "string"; - } - - var lastDot = str.LastIndexOf ('.'); - if (str.StartsWith ("System") && lastDot == "System".Length) - return str.Substring (lastDot + 1); - - return str; -} - private string GetBaseString () { if (Class.BaseClasses.Count == 0) @@ -366,9 +333,9 @@ private bool IsByVal (CppType t) if (method.IsConstructor) Write ("CppInstancePtr"); else - Write (GetCSharpType (method.ReturnType)); + Write (CSharpLanguage.TypeName (method.ReturnType)); Write (" "); - Write (method.Name); + Write (CSharpLanguage.SafeIdentifier (method.Name)); Write (" ("); if (!method.IsStatic) { @@ -381,7 +348,7 @@ private bool IsByVal (CppType t) Write (");\n"); } foreach (var field in Class.Fields.Where (f => f.Access != Access.@private)) { - WriteLine ("CppField<{0}> {1} {{ get; }}", GetCSharpType (field.Type), field.Name); + WriteLine ("CppField<{0}> {1} {{ get; }}", CSharpLanguage.TypeName (field.Type), CSharpLanguage.SafeIdentifier (field.Name)); } ClearIndent (); @@ -431,7 +398,7 @@ private bool IsByVal (CppType t) #line hidden #line 76 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" - this.Write(this.ToStringHelper.ToStringWithCulture( GetCSharpType (field.Type) )); + this.Write(this.ToStringHelper.ToStringWithCulture( CSharpLanguage.TypeName (field.Type) )); #line default #line hidden @@ -443,7 +410,7 @@ private bool IsByVal (CppType t) #line hidden #line 76 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" - this.Write(this.ToStringHelper.ToStringWithCulture( field.Name )); + this.Write(this.ToStringHelper.ToStringWithCulture( CSharpLanguage.SafeIdentifier (field.Name) )); #line default #line hidden @@ -475,165 +442,166 @@ private bool IsByVal (CppType t) #line 81 "/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); + var fieldName = CSharpLanguage.SafeIdentifier (field.Name); + WriteLine ("{0} {1} {2} {{", field.Access, CSharpLanguage.TypeName (field.Type), fieldName); #line default #line hidden - #line 84 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 85 "/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 85 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" - this.Write(this.ToStringHelper.ToStringWithCulture( field.Name )); + #line 86 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( fieldName )); #line default #line hidden - #line 85 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 86 "/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 88 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" - this.Write(this.ToStringHelper.ToStringWithCulture( field.Name )); + #line 89 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + this.Write(this.ToStringHelper.ToStringWithCulture( fieldName )); #line default #line hidden - #line 88 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 89 "/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 91 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 92 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" } ClearIndent(); #line default #line hidden - #line 92 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 93 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n"); #line default #line hidden - #line 93 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 94 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" /* Subclass constructor */ #line default #line hidden - #line 94 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 95 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\tpublic "); #line default #line hidden - #line 94 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 95 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 94 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 95 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" (CppTypeInfo subClass)\n\t\t"); #line default #line hidden - #line 95 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 96 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( layoutClass )); #line default #line hidden - #line 95 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 96 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n\t\t\tsubClass.AddBase (impl.TypeInfo);\n\t\t"); #line default #line hidden - #line 97 "/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( initBases )); #line default #line hidden - #line 97 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 98 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n\n"); #line default #line hidden - #line 99 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 100 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" /* Native constructor */ #line default #line hidden - #line 100 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 101 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\tpublic "); #line default #line hidden - #line 100 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 101 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 100 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 101 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" (CppInstancePtr native)\n\t\t"); #line default #line hidden - #line 101 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 102 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( layoutClass )); #line default #line hidden - #line 101 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 102 "/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 103 "/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( initBases )); #line default #line hidden - #line 103 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 104 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n\n"); #line default #line hidden - #line 105 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 106 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" /* Wrapper methods */ #line default #line hidden - #line 106 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 107 "/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); WriteMethodHeader (method, layoutClass, false, false); if (method.IsConstructor) Write ("Native = "); - Write ("impl.{0} (", method.Name); + Write ("impl.{0} (", methodName); if (!method.IsStatic) { if (method.IsConstructor) Write ("impl.Alloc (this)"); @@ -657,22 +625,23 @@ private bool IsByVal (CppType t) #line default #line hidden - #line 134 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 135 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n"); #line default #line hidden - #line 135 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 136 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" /* Wrapper properties */ #line default #line hidden - #line 136 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 137 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" PushIndent ("\t\t"); foreach (var prop in Class.Properties) { - var type = GetCSharpType (prop.Type); + var propName = CSharpLanguage.SafeIdentifier (prop.Name); + var type = CSharpLanguage.TypeName (prop.Type); Write (CurrentIndent + "public "); @@ -682,7 +651,7 @@ private bool IsByVal (CppType t) Write (type); Write (" "); - Write (prop.Name); + Write (propName); Write (" {\n"); PushIndent ("\t"); @@ -702,7 +671,7 @@ private bool IsByVal (CppType t) if (prop.SetMethod.IsVirtual) Write ("[OverrideNative (\"{0}\")] ", prop.SetMethod.Name); - Write ("set {\n"); + WriteLine ("set {"); PushIndent ("\t"); WriteLine ("impl.{0} (Native, value);", prop.SetMethod.Name); PopIndent (); @@ -717,218 +686,218 @@ private bool IsByVal (CppType t) #line default #line hidden - #line 179 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 181 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n\t\tpublic "); #line default #line hidden - #line 180 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 182 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( hasBase? "override" : "virtual" )); #line default #line hidden - #line 180 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 182 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" void Dispose ()\n\t\t{\n"); #line default #line hidden - #line 182 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 184 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" if (Class.Methods.Any (m => m.IsDestructor && !m.IsArtificial)) { #line default #line hidden - #line 183 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 185 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\t\timpl.Destruct (Native);\n"); #line default #line hidden - #line 184 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 186 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" } #line default #line hidden - #line 185 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 187 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\t\tNative.Dispose ();\n\t\t}\n\n\t\tprivate void __cxxi_LayoutClass ()\n\t\t{\n"); #line default #line hidden - #line 190 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 192 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" foreach (var npBase in Class.BaseClasses.Skip (1)) { #line default #line hidden - #line 191 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 193 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\t\tnew "); #line default #line hidden - #line 191 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 193 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 191 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 193 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" (impl.TypeInfo);\n"); #line default #line hidden - #line 192 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 194 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" } #line default #line hidden - #line 193 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 195 "/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 196 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 198 "/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 198 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 200 "/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 199 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 201 "/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 201 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\n\t\tprivate class "); #line default #line hidden - #line 200 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 202 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper + "__" + npBase.Name )); #line default #line hidden - #line 200 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 202 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" : "); #line default #line hidden - #line 200 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 202 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 200 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 202 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" {\n\t\t\tpublic "); #line default #line hidden - #line 201 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 203 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 201 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 203 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" instance;\n\t\t\tpublic "); #line default #line hidden - #line 202 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 204 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper + "__" + npBase.Name )); #line default #line hidden - #line 202 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 204 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" ("); #line default #line hidden - #line 202 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 204 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 202 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 204 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" instance)\n\t\t\t\t: base ("); #line default #line hidden - #line 203 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 205 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 203 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 205 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(".impl.TypeInfo.Cast (instance, typeof ("); #line default #line hidden - #line 203 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 205 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 203 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 205 "/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 205 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 207 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 205 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 207 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(".impl.TypeInfo.InitNonPrimaryBase (this, instance, typeof ("); #line default #line hidden - #line 205 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 207 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 205 "/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\t\t\tthis.instance = instance;\n\t\t\t}\n\n"); #line default #line hidden - #line 209 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 211 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" PushIndent ("\t\t\t"); foreach (var method in npBase.Methods.Where (m => m.IsVirtual)) { @@ -958,163 +927,163 @@ foreach (var npBase in Class.BaseClasses.Skip (1)) { #line default #line hidden - #line 234 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 236 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\t}\n\t\tprivate "); #line default #line hidden - #line 235 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 237 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 235 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 237 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("__"); #line default #line hidden - #line 235 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 237 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 235 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 237 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" __cxxi_"); #line default #line hidden - #line 235 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 237 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 235 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 237 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(";\n\t\tpublic "); #line default #line hidden - #line 236 "/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 236 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 238 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" "); #line default #line hidden - #line 236 "/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 236 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 238 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" { get { return __cxxi_"); #line default #line hidden - #line 236 "/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 236 "/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\tpublic static implicit operator "); #line default #line hidden - #line 237 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 239 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 237 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 239 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("("); #line default #line hidden - #line 237 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 239 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 237 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 239 "/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 239 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 241 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 239 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 241 "/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 241 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 243 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper )); #line default #line hidden - #line 241 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 243 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("("); #line default #line hidden - #line 241 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 243 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 241 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 243 "/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 244 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 246 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper + "__" + npBase.Name )); #line default #line hidden - #line 244 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 246 "/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 249 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 251 "/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 250 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 252 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" PushIndent ("\t\t"); foreach (var method in npBase.Methods.Where (m => m.IsVirtual)) { @@ -1137,67 +1106,67 @@ if (Class.BaseClasses.Count > 1) { #line default #line hidden - #line 268 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 270 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\tprivate void __cxxi_InitBases ()\n\t\t{\n"); #line default #line hidden - #line 270 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 272 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" foreach (var npBase in Class.BaseClasses.Skip (1)) { #line default #line hidden - #line 271 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 273 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\t\t__cxxi_"); #line default #line hidden - #line 271 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 273 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( npBase.Name )); #line default #line hidden - #line 271 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 273 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" = new "); #line default #line hidden - #line 271 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 273 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(this.ToStringHelper.ToStringWithCulture( wrapper + "__" + npBase.Name )); #line default #line hidden - #line 271 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 273 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write(" (this);\n"); #line default #line hidden - #line 272 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 274 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" } #line default #line hidden - #line 273 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 275 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t\t}\n"); #line default #line hidden - #line 274 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 276 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" } #line default #line hidden - #line 275 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" + #line 277 "/Users/alex/OpenSource/cppinterop/src/generator/Templates/CSharp/CSharpClass.tt" this.Write("\t}\n}\n\n"); #line default diff --git a/src/generator/Templates/CSharp/CSharpClass.tt b/src/generator/Templates/CSharp/CSharpClass.tt index 30136141..33a0cf19 100644 --- a/src/generator/Templates/CSharp/CSharpClass.tt +++ b/src/generator/Templates/CSharp/CSharpClass.tt @@ -51,9 +51,9 @@ namespace <#= Generator.Namespace #> { if (method.IsConstructor) Write ("CppInstancePtr"); else - Write (GetCSharpType (method.ReturnType)); + Write (CSharpLanguage.TypeName (method.ReturnType)); Write (" "); - Write (method.Name); + Write (CSharpLanguage.SafeIdentifier (method.Name)); Write (" ("); if (!method.IsStatic) { @@ -66,26 +66,27 @@ namespace <#= Generator.Namespace #> { Write (");\n"); } foreach (var field in Class.Fields.Where (f => f.Access != Access.@private)) { - WriteLine ("CppField<{0}> {1} {{ get; }}", GetCSharpType (field.Type), field.Name); + WriteLine ("CppField<{0}> {1} {{ get; }}", CSharpLanguage.TypeName (field.Type), CSharpLanguage.SafeIdentifier (field.Name)); } ClearIndent (); #> } <# /* Native layout */ #> private struct <#= layout #> { <# foreach (var field in Class.Fields) { #> - public <#= GetCSharpType (field.Type) #> <#= field.Name #>; + public <#= CSharpLanguage.TypeName (field.Type) #> <#= CSharpLanguage.SafeIdentifier (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); #> + var fieldName = CSharpLanguage.SafeIdentifier (field.Name); + WriteLine ("{0} {1} {2} {{", field.Access, CSharpLanguage.TypeName (field.Type), fieldName); #> get { - return impl.<#= field.Name #> [Native]; + return impl.<#= fieldName #> [Native]; } set { - impl.<#= field.Name #> [Native] = value; + impl.<#= fieldName #> [Native] = value; } } <# } ClearIndent(); #> @@ -105,13 +106,13 @@ namespace <#= Generator.Namespace #> { <# /* Wrapper methods */ #> <# PushIndent ("\t\t"); foreach (var method in Class.Methods.Where (m => m.GenWrapperMethod)) { - + var methodName = CSharpLanguage.SafeIdentifier (method.Name); WriteMethodHeader (method, layoutClass, false, false); if (method.IsConstructor) Write ("Native = "); - Write ("impl.{0} (", method.Name); + Write ("impl.{0} (", methodName); if (!method.IsStatic) { if (method.IsConstructor) Write ("impl.Alloc (this)"); @@ -135,7 +136,8 @@ namespace <#= Generator.Namespace #> { <# /* Wrapper properties */ #> <# PushIndent ("\t\t"); foreach (var prop in Class.Properties) { - var type = GetCSharpType (prop.Type); + var propName = CSharpLanguage.SafeIdentifier (prop.Name); + var type = CSharpLanguage.TypeName (prop.Type); Write (CurrentIndent + "public "); @@ -145,7 +147,7 @@ namespace <#= Generator.Namespace #> { Write (type); Write (" "); - Write (prop.Name); + Write (propName); Write (" {\n"); PushIndent ("\t"); @@ -165,7 +167,7 @@ namespace <#= Generator.Namespace #> { if (prop.SetMethod.IsVirtual) Write ("[OverrideNative (\"{0}\")] ", prop.SetMethod.Name); - Write ("set {\n"); + WriteLine ("set {"); PushIndent ("\t"); WriteLine ("impl.{0} (Native, value);", prop.SetMethod.Name); PopIndent (); @@ -278,7 +280,7 @@ if (Class.BaseClasses.Count > 1) { #> <#+ private void WriteMethodHeader (Method method, string layoutClass, bool isNonPrimaryOverride, bool @protected) { - var returnType = GetCSharpType (method.ReturnType); + var returnType = CSharpLanguage.TypeName (method.ReturnType); if (!isNonPrimaryOverride && method.IsVirtual) WriteLine ("[OverrideNative (\"{0}\")]", method.Name); @@ -318,7 +320,7 @@ private void WriteParameters (IList parameters, bool writeType, bool if (i != 0) Write (", "); - var type = GetCSharpType (parameters [i].Type); + var type = CSharpLanguage.TypeName (parameters [i].Type); if (writeAttributes) { var mangleAs = parameters [i].Type.ToString (); @@ -330,7 +332,7 @@ private void WriteParameters (IList parameters, bool writeType, bool if (type.EndsWith ("&")) { Write ("ref "); - type = GetCSharpType (type.TrimEnd ('&')); + type = CSharpLanguage.TypeName (type.TrimEnd ('&')); } if (writeType) { @@ -338,43 +340,10 @@ private void WriteParameters (IList parameters, bool writeType, bool Write (" "); } - Write (parameters [i].Name); + Write (CSharpLanguage.SafeIdentifier (parameters [i].Name)); } } -private string GetCSharpType (CppType t) -{ - return GetCSharpType (Generator.CppTypeToManaged (t)); -} - -private string GetCSharpType (string str) -{ - switch (str) { - case "System.Void": return "void"; - case "System.Boolean": return "bool"; - case "System.Byte": return "byte"; - case "System.SByte": return "sbyte"; - case "System.Char": return "char"; - case "System.Int16": return "short"; - case "System.UInt16": return "ushort"; - case "System.Decimal": return "decimal"; - case "System.Single": return "float"; - case "System.Double": return "double"; - case "System.Int32": return "int"; - case "System.UInt32": return "uint"; - case "System.Int64": return "long"; - case "System.UInt64": return "ulong"; - case "System.Object": return "object"; - case "System.String": return "string"; - } - - var lastDot = str.LastIndexOf ('.'); - if (str.StartsWith ("System") && lastDot == "System".Length) - return str.Substring (lastDot + 1); - - return str; -} - private string GetBaseString () { if (Class.BaseClasses.Count == 0) diff --git a/src/generator/Templates/CSharp/CSharpLanguage.cs b/src/generator/Templates/CSharp/CSharpLanguage.cs new file mode 100644 index 00000000..8ff24a7c --- /dev/null +++ b/src/generator/Templates/CSharp/CSharpLanguage.cs @@ -0,0 +1,67 @@ +using System; +using System.Linq; + +using Mono.Cxxi; + +namespace Templates { + public static class CSharpLanguage { + + // from https://github.com/mono/mono/blob/master/mcs/class/System/Microsoft.CSharp/CSharpCodeGenerator.cs + private static string[] keywords = new string[] { + "abstract","event","new","struct","as","explicit","null","switch","base","extern", + "this","false","operator","throw","break","finally","out","true", + "fixed","override","try","case","params","typeof","catch","for", + "private","foreach","protected","checked","goto","public", + "unchecked","class","if","readonly","unsafe","const","implicit","ref", + "continue","in","return","using","virtual","default", + "interface","sealed","volatile","delegate","internal","do","is", + "sizeof","while","lock","stackalloc","else","static","enum", + "namespace", + "object","bool","byte","float","uint","char","ulong","ushort", + "decimal","int","sbyte","short","double","long","string","void", + "partial", "yield", "where" + }; + + public static string SafeIdentifier (string proposedName) + { + return keywords.Contains (proposedName)? "@" + proposedName : proposedName; + } + + public static string TypeName (CppType t) + { + return TypeName (Generator.CppTypeToManaged (t)); + } + + public static string TypeName (string str) + { + switch (str) { + case "System.Void": return "void"; + case "System.Boolean": return "bool"; + case "System.Byte": return "byte"; + case "System.SByte": return "sbyte"; + case "System.Char": return "char"; + case "System.Int16": return "short"; + case "System.UInt16": return "ushort"; + case "System.Decimal": return "decimal"; + case "System.Single": return "float"; + case "System.Double": return "double"; + case "System.Int32": return "int"; + case "System.UInt32": return "uint"; + case "System.Int64": return "long"; + case "System.UInt64": return "ulong"; + case "System.Object": return "object"; + case "System.String": return "string"; + } + + // we are using System by default + var lastDot = str.LastIndexOf ('.'); + if (str.StartsWith ("System") && lastDot == "System".Length) + return str.Substring (lastDot + 1); + + return str; + } + + + } +} + diff --git a/src/generator/generator.csproj b/src/generator/generator.csproj index 9adffd87..864900d1 100644 --- a/src/generator/generator.csproj +++ b/src/generator/generator.csproj @@ -69,14 +69,14 @@ CSharpLibs.tt + - - +