diff --git a/src/AST/Field.cs b/src/AST/Field.cs index 1a36b824..8078fd3c 100644 --- a/src/AST/Field.cs +++ b/src/AST/Field.cs @@ -22,6 +22,12 @@ namespace CppSharp.AST public uint BitWidth { get; set; } + public string InternalName + { + get { return internalName ?? (internalName = OriginalName); } + set { internalName = value; } + } + public Field() { Offset = 0; @@ -49,5 +55,7 @@ namespace CppSharp.AST { return visitor.VisitFieldDecl(this); } + + private string internalName; } } \ No newline at end of file diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index aa6e0d25..f060d630 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -715,7 +715,7 @@ namespace CppSharp.Generators.CSharp !(@class != null && @class.IsUnion)) || (@class != null && @class.TranslationUnit.IsSystemHeader)) return; - var safeIdentifier = Helpers.SafeIdentifier(field.OriginalName); + var safeIdentifier = Helpers.SafeIdentifier(field.InternalName); if(safeIdentifier.All(c => c.Equals('_'))) { @@ -863,7 +863,7 @@ namespace CppSharp.Generators.CSharp string arrPtrIden = Helpers.SafeIdentifier("arrPtr"); WriteLine(string.Format("fixed ({0} {1} = {2}.{3})", type.Replace("[]", "*"), arrPtrIden, Helpers.InstanceField, - Helpers.SafeIdentifier(field.OriginalName))); + Helpers.SafeIdentifier(field.InternalName))); WriteStartBraceIndent(); ctx.ReturnVarName = arrPtrIden; } @@ -874,7 +874,7 @@ namespace CppSharp.Generators.CSharp ? Helpers.InstanceField : string.Format("((Internal*) {0})", Helpers.InstanceIdentifier), @class.IsValueType ? "." : "->", - Helpers.SafeIdentifier(field.OriginalName)); + Helpers.SafeIdentifier(field.InternalName)); } param.Visit(marshal); @@ -976,7 +976,7 @@ namespace CppSharp.Generators.CSharp ? Helpers.InstanceField : string.Format("((Internal*) {0})", Helpers.InstanceIdentifier), @class.IsValueType ? "." : "->", - Helpers.SafeIdentifier(field.OriginalName)), + Helpers.SafeIdentifier(field.InternalName)), ReturnType = decl.QualifiedType }; @@ -989,7 +989,7 @@ namespace CppSharp.Generators.CSharp string arrPtrIden = Helpers.SafeIdentifier("arrPtr"); WriteLine(string.Format("fixed ({0} {1} = {2}.{3})", type.Replace("[]","*"), arrPtrIden, Helpers.InstanceField, - Helpers.SafeIdentifier(field.OriginalName))); + Helpers.SafeIdentifier(field.InternalName))); WriteStartBraceIndent(); ctx.ReturnVarName = arrPtrIden; } @@ -1142,7 +1142,7 @@ namespace CppSharp.Generators.CSharp { GenerateClassField(prop.Field); WriteLine("private bool {0};", - GeneratedIdentifier(string.Format("{0}Initialised", prop.Field.OriginalName))); + GeneratedIdentifier(string.Format("{0}Initialised", prop.Field.InternalName))); } GenerateDeclarationCommon(prop); diff --git a/src/Generator/Passes/CheckDuplicatedNamesPass.cs b/src/Generator/Passes/CheckDuplicatedNamesPass.cs index 1785c708..8caf628d 100644 --- a/src/Generator/Passes/CheckDuplicatedNamesPass.cs +++ b/src/Generator/Passes/CheckDuplicatedNamesPass.cs @@ -100,18 +100,6 @@ namespace CppSharp.Passes names = new Dictionary(); } - public override bool VisitFieldDecl(Field decl) - { - if (!VisitDeclaration(decl)) - return false; - - if (ASTUtils.CheckIgnoreField(decl)) - return false; - - CheckDuplicate(decl); - return false; - } - public override bool VisitProperty(Property decl) { if (!VisitDeclaration(decl)) @@ -165,8 +153,12 @@ namespace CppSharp.Passes foreach (var function in @class.Functions) VisitFunctionDecl(function); - foreach (var field in @class.Fields) - VisitFieldDecl(field); + foreach (var fields in GetAllFields(@class).GroupBy(f => f.OriginalName).Where( + g => !string.IsNullOrEmpty(g.Key)).Select(g => g.ToList())) + { + for (var i = 1; i < fields.Count; i++) + fields[i].InternalName = fields[i].OriginalName + i; + } foreach (var property in @class.Properties) VisitProperty(property); @@ -183,6 +175,15 @@ namespace CppSharp.Passes return false; } + private static IEnumerable GetAllFields(Class @class, List fields = null) + { + fields = fields ?? new List(); + foreach (var @base in @class.Bases.Where(b => b.IsClass)) + GetAllFields(@base.Class, fields); + fields.AddRange(@class.Fields); + return fields; + } + void CheckDuplicate(Declaration decl) { if (decl.IsDependent || !decl.IsGenerated) diff --git a/tests/CSharpTemp/CSharpTemp.Tests.cs b/tests/CSharpTemp/CSharpTemp.Tests.cs index 1df0d8ca..fd8da077 100644 --- a/tests/CSharpTemp/CSharpTemp.Tests.cs +++ b/tests/CSharpTemp/CSharpTemp.Tests.cs @@ -102,6 +102,7 @@ public class CSharpTempTests : GeneratorTestFixture Assert.That(baz.TakesQux(baz), Is.EqualTo(20)); Assert.That(baz.ReturnQux().FarAwayFunc, Is.EqualTo(20)); baz.SetMethod(1); + Assert.AreEqual(5, baz.P); } } diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 88aa6401..bb4c5edf 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -93,6 +93,8 @@ public: Baz(); + int P; + int takesQux(const Qux& qux); Qux returnQux(); void setMethod(int value); @@ -101,7 +103,7 @@ public: FunctionTypedef functionTypedef; }; -Baz::Baz() {} +Baz::Baz() : P(5) {} struct QArrayData {