diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 90cc6c13..b4e72a79 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -724,6 +724,11 @@ namespace CppSharp.Generators.CSharp var safeIdentifier = Helpers.SafeIdentifier(field.OriginalName); + if(safeIdentifier.All(c => c.Equals('_'))) + { + safeIdentifier = Helpers.SafeIdentifier(field.Name); + } + PushBlock(CSharpBlockKind.Field); WriteLine("[FieldOffset({0})]", field.OffsetInBytes); diff --git a/src/Generator/Passes/CleanInvalidDeclNamesPass.cs b/src/Generator/Passes/CleanInvalidDeclNamesPass.cs index 70ecfc9b..9eb352a1 100644 --- a/src/Generator/Passes/CleanInvalidDeclNamesPass.cs +++ b/src/Generator/Passes/CleanInvalidDeclNamesPass.cs @@ -3,6 +3,7 @@ using System.Linq; using CppSharp.AST; using CppSharp.Generators.CLI; using CppSharp.Generators.CSharp; +using System.Text; namespace CppSharp.Passes { @@ -153,6 +154,21 @@ namespace CppSharp.Passes item.Name = CheckName(item.Name); return base.VisitEnumItem(item); } + + public override bool VisitFieldDecl(Field field) + { + if (field.Class.Fields.Count(c => c.Name.Equals(field.Name)) > 1) + { + StringBuilder str = new StringBuilder(); + str.Append(field.Name); + do + { + str.Append('_'); + } while (field.Class.Fields.Any(c => c.Name.Equals(str.ToString()))); + field.Name = str.ToString(); + } + return base.VisitFieldDecl(field); + } } } diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index 488dd2c5..de990011 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -647,6 +647,24 @@ public: { }; }; + struct + { + struct + { + }; + }; + struct + { + struct + { + }; + }; + struct + { + struct + { + }; + }; union as_types {