diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs index 69edf35a..9ef0392c 100644 --- a/src/Generator/Driver.cs +++ b/src/Generator/Driver.cs @@ -246,8 +246,8 @@ namespace CppSharp Generator.SetupPasses(); - TranslationUnitPasses.AddPass(new CleanInvalidDeclNamesPass()); TranslationUnitPasses.AddPass(new FlattenAnonymousTypesToFields()); + TranslationUnitPasses.AddPass(new CleanInvalidDeclNamesPass()); TranslationUnitPasses.AddPass(new FieldToPropertyPass()); TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass()); TranslationUnitPasses.AddPass(new CheckFlagEnumsPass()); diff --git a/src/Generator/Passes/FlattenAnonymousTypesToFields.cs b/src/Generator/Passes/FlattenAnonymousTypesToFields.cs index e7164ad0..964cb710 100644 --- a/src/Generator/Passes/FlattenAnonymousTypesToFields.cs +++ b/src/Generator/Passes/FlattenAnonymousTypesToFields.cs @@ -43,7 +43,23 @@ namespace CppSharp.Passes continue; ReplaceField(@class, i, fieldType); - ReplaceLayoutField(@class, field, fieldType); + fieldType.Fields.Clear(); + fieldType.ExplicitlyIgnore(); + } + + if (@class.Layout == null) + return true; + + for (int i = @class.Layout.Fields.Count - 1; i >= 0; i--) + { + LayoutField field = @class.Layout.Fields[i]; + Class fieldType; + if (!string.IsNullOrEmpty(field.Name) || + !field.QualifiedType.Type.Desugar().TryGetClass(out fieldType) || + !string.IsNullOrEmpty(fieldType.OriginalName)) + continue; + + ReplaceLayoutField(@class, i, fieldType); fieldType.Fields.Clear(); fieldType.ExplicitlyIgnore(); } @@ -63,18 +79,23 @@ namespace CppSharp.Passes } } - private static void ReplaceLayoutField(Class @class, Field field, Class fieldType) + private static void ReplaceLayoutField(Class @class, int i, Class fieldType) { - LayoutField layoutField = @class.Layout.Fields.Find( - f => f.FieldPtr == field.OriginalPtr); - int layoutIndex = @class.Layout.Fields.IndexOf(layoutField); - @class.Layout.Fields.RemoveAt(layoutIndex); + uint offset = @class.Layout.Fields[i].Offset; + @class.Layout.Fields.RemoveAt(i); for (int j = 0; j < fieldType.Layout.Fields.Count; j++) { - LayoutField nestedlayoutField = fieldType.Layout.Fields[j]; - nestedlayoutField.Offset += layoutField.Offset; - @class.Layout.Fields.Insert(layoutIndex + j, nestedlayoutField); + LayoutField nestedLayoutField = fieldType.Layout.Fields[j]; + var layoutField = new LayoutField + { + Expression = nestedLayoutField.Expression, + FieldPtr = nestedLayoutField.FieldPtr, + Name = nestedLayoutField.Name, + Offset = nestedLayoutField.Offset + offset, + QualifiedType = nestedLayoutField.QualifiedType + }; + @class.Layout.Fields.Insert(i + j, layoutField); } } } diff --git a/tests/CSharp/CSharp.Tests.cs b/tests/CSharp/CSharp.Tests.cs index ba751d46..e3137c5f 100644 --- a/tests/CSharp/CSharp.Tests.cs +++ b/tests/CSharp/CSharp.Tests.cs @@ -142,7 +142,11 @@ public unsafe class CSharpTests : 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); + Assert.That(baz.P, Is.EqualTo(5)); + baz.PublicDouble = 1.5; + Assert.That(baz.PublicDouble, Is.EqualTo(1.5)); + baz.PublicInt = 15; + Assert.That(baz.PublicInt, Is.EqualTo(15)); } } diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h index 99b28b04..4e73f2fb 100644 --- a/tests/CSharp/CSharp.h +++ b/tests/CSharp/CSharp.h @@ -104,6 +104,11 @@ public: Foo foos[4]; int getIndex(); void setIndex(int value); + union + { + int publicInt; + double publicDouble; + }; private: int index;