Browse Source

Generate valid C# when a secondary base has a public anonymous field

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1159/merge
Dimitar Dobrev 6 years ago
parent
commit
caed19e863
  1. 2
      src/Generator/Driver.cs
  2. 39
      src/Generator/Passes/FlattenAnonymousTypesToFields.cs
  3. 6
      tests/CSharp/CSharp.Tests.cs
  4. 5
      tests/CSharp/CSharp.h

2
src/Generator/Driver.cs

@ -246,8 +246,8 @@ namespace CppSharp
Generator.SetupPasses(); Generator.SetupPasses();
TranslationUnitPasses.AddPass(new CleanInvalidDeclNamesPass());
TranslationUnitPasses.AddPass(new FlattenAnonymousTypesToFields()); TranslationUnitPasses.AddPass(new FlattenAnonymousTypesToFields());
TranslationUnitPasses.AddPass(new CleanInvalidDeclNamesPass());
TranslationUnitPasses.AddPass(new FieldToPropertyPass()); TranslationUnitPasses.AddPass(new FieldToPropertyPass());
TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass()); TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
TranslationUnitPasses.AddPass(new CheckFlagEnumsPass()); TranslationUnitPasses.AddPass(new CheckFlagEnumsPass());

39
src/Generator/Passes/FlattenAnonymousTypesToFields.cs

@ -43,7 +43,23 @@ namespace CppSharp.Passes
continue; continue;
ReplaceField(@class, i, fieldType); 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.Fields.Clear();
fieldType.ExplicitlyIgnore(); 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( uint offset = @class.Layout.Fields[i].Offset;
f => f.FieldPtr == field.OriginalPtr); @class.Layout.Fields.RemoveAt(i);
int layoutIndex = @class.Layout.Fields.IndexOf(layoutField);
@class.Layout.Fields.RemoveAt(layoutIndex);
for (int j = 0; j < fieldType.Layout.Fields.Count; j++) for (int j = 0; j < fieldType.Layout.Fields.Count; j++)
{ {
LayoutField nestedlayoutField = fieldType.Layout.Fields[j]; LayoutField nestedLayoutField = fieldType.Layout.Fields[j];
nestedlayoutField.Offset += layoutField.Offset; var layoutField = new LayoutField
@class.Layout.Fields.Insert(layoutIndex + j, nestedlayoutField); {
Expression = nestedLayoutField.Expression,
FieldPtr = nestedLayoutField.FieldPtr,
Name = nestedLayoutField.Name,
Offset = nestedLayoutField.Offset + offset,
QualifiedType = nestedLayoutField.QualifiedType
};
@class.Layout.Fields.Insert(i + j, layoutField);
} }
} }
} }

6
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.TakesQux(baz), Is.EqualTo(20));
Assert.That(baz.ReturnQux().FarAwayFunc, Is.EqualTo(20)); Assert.That(baz.ReturnQux().FarAwayFunc, Is.EqualTo(20));
baz.SetMethod(1); 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));
} }
} }

5
tests/CSharp/CSharp.h

@ -104,6 +104,11 @@ public:
Foo foos[4]; Foo foos[4];
int getIndex(); int getIndex();
void setIndex(int value); void setIndex(int value);
union
{
int publicInt;
double publicDouble;
};
private: private:
int index; int index;

Loading…
Cancel
Save