Skip to content

Commit 99be2a8

Browse files
committed
Move enums nested in classes to their parents
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 9cad946 commit 99be2a8

File tree

5 files changed

+66
-17
lines changed

5 files changed

+66
-17
lines changed

src/AST/Declaration.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -201,13 +201,15 @@ public virtual string LogicalOriginalName
201201
public string GetQualifiedName(Func<Declaration, string> getName,
202202
Func<Declaration, DeclarationContext> getNamespace)
203203
{
204-
if (Namespace == null)
204+
DeclarationContext declarationContext = getNamespace(this);
205+
206+
if (declarationContext == null)
205207
return getName(this);
206208

207-
if (Namespace.IsRoot)
209+
if (declarationContext.IsRoot)
208210
return getName(this);
209211

210-
var namespaces = GatherNamespaces(getNamespace(this));
212+
var namespaces = GatherNamespaces(declarationContext);
211213

212214
var names = namespaces.Select(getName).ToList();
213215
names.Add(getName(this));

src/Generator/Driver.cs

+1
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ public void SetupPasses(ILibrary library)
235235
TranslationUnitPasses.AddPass(new FindSymbolsPass());
236236
TranslationUnitPasses.AddPass(new CheckMacroPass());
237237
TranslationUnitPasses.AddPass(new CheckStaticClass());
238+
TranslationUnitPasses.AddPass(new MoveNonScopedNestedEnumsToParentPass());
238239
TranslationUnitPasses.AddPass(new MoveOperatorToClassPass());
239240
TranslationUnitPasses.AddPass(new MoveFunctionToClassPass());
240241
TranslationUnitPasses.AddPass(new CheckAmbiguousFunctions());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using CppSharp.AST;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
namespace CppSharp.Passes
6+
{
7+
/// <summary>
8+
/// This pass moves enumerations nested in classes to the parents of those classes.
9+
/// Historically enumerations have been placed in classes, in the overwhelming
10+
/// majority of cases, only because enumerations used to lack scoping before C++11.
11+
/// </summary>
12+
public class MoveNonScopedNestedEnumsToParentPass : TranslationUnitPass
13+
{
14+
public override bool VisitASTContext(ASTContext context)
15+
{
16+
bool result = base.VisitASTContext(context);
17+
18+
foreach (var movableEnum in movableEnums)
19+
{
20+
DeclarationContext declarationContext = movableEnum.Namespace;
21+
declarationContext.Declarations.Remove(movableEnum);
22+
declarationContext.Namespace.Declarations.Add(movableEnum);
23+
movableEnum.Namespace = declarationContext.Namespace;
24+
}
25+
26+
return result;
27+
}
28+
29+
public override bool VisitEnumDecl(Enumeration @enum)
30+
{
31+
if (!base.VisitEnumDecl(@enum) ||
32+
string.IsNullOrEmpty(@enum.OriginalName))
33+
return false;
34+
35+
if (@enum.Namespace is Class &&
36+
@enum.Access == AccessSpecifier.Public &&
37+
@enum.Namespace.Namespace.Declarations.All(
38+
d => d.OriginalName != @enum.OriginalName))
39+
movableEnums.Add(@enum);
40+
41+
return true;
42+
}
43+
44+
private List<Enumeration> movableEnums = new List<Enumeration>();
45+
}
46+
}

tests/CSharp/CSharp.Tests.cs

+9-9
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ public void TestUncompilableCode()
3838
new HasCtorWithMappedToEnum<TestFlag>(TestFlag.Flag1).Dispose();
3939
using (var testOverrideFromSecondaryBase = new TestOverrideFromSecondaryBase())
4040
{
41-
testOverrideFromSecondaryBase.function();
41+
testOverrideFromSecondaryBase.Function();
4242
var ok = false;
43-
testOverrideFromSecondaryBase.function(ref ok);
44-
var property = testOverrideFromSecondaryBase.property;
43+
testOverrideFromSecondaryBase.Function(ref ok);
44+
var property = testOverrideFromSecondaryBase.Property;
4545
testOverrideFromSecondaryBase.VirtualMember();
4646
}
4747
using (var foo = new Foo())
@@ -670,12 +670,12 @@ public void TestEnumProperty()
670670
{
671671
using (var proprietor = new Proprietor())
672672
{
673-
Assert.That(proprietor.Items, Is.EqualTo(Bar.Items.Item1));
674-
proprietor.Items = Bar.Items.Item2;
675-
Assert.That(proprietor.Items, Is.EqualTo(Bar.Items.Item2));
676-
Assert.That(proprietor.ItemsByValue, Is.EqualTo(Bar.Items.Item1));
677-
proprietor.ItemsByValue = Bar.Items.Item2;
678-
Assert.That(proprietor.ItemsByValue, Is.EqualTo(Bar.Items.Item2));
673+
Assert.That(proprietor.Items, Is.EqualTo(Items.Item1));
674+
proprietor.Items = Items.Item2;
675+
Assert.That(proprietor.Items, Is.EqualTo(Items.Item2));
676+
Assert.That(proprietor.ItemsByValue, Is.EqualTo(Items.Item1));
677+
proprietor.ItemsByValue = Items.Item2;
678+
Assert.That(proprietor.ItemsByValue, Is.EqualTo(Items.Item2));
679679
}
680680
}
681681

tests/Common/Common.Tests.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public unsafe void TestCodeGeneration()
2323
using (var foo = new Foo())
2424
{
2525
Bar bar = foo;
26-
Assert.IsTrue(Bar.Item.Item1 == bar);
26+
Assert.IsTrue(Item.Item1 == bar);
2727

2828
using (var hasOverloadsWithDifferentPointerKindsToSameType =
2929
new HasOverloadsWithDifferentPointerKindsToSameType())
@@ -101,7 +101,7 @@ public void TestHello()
101101

102102
var bar = new Bar { A = 4, B = 7 };
103103
Assert.That(hello.AddBar(bar), Is.EqualTo(11));
104-
Assert.That(bar.RetItem1(), Is.EqualTo(Bar.Item.Item1));
104+
Assert.That(bar.RetItem1(), Is.EqualTo(Item.Item1));
105105

106106
var retFoo = hello.RetFoo(7, 2.0f);
107107
Assert.That(retFoo.A, Is.EqualTo(7));
@@ -245,7 +245,7 @@ public void TestLeftShiftOperator()
245245
{
246246
var foo2 = new Foo2 { C = 2 };
247247
Foo2 result = foo2 << 3;
248-
foo2.TestKeywordParam(IntPtr.Zero, Bar.Item.Item1, 1);
248+
foo2.TestKeywordParam(IntPtr.Zero, Item.Item1, 1);
249249
Assert.That(result.C, Is.EqualTo(16));
250250
}
251251

@@ -501,8 +501,8 @@ public void TestProperties()
501501
prop.VirtualSetterReturnsBoolean = 45;
502502
Assert.That(prop.VirtualSetterReturnsBoolean, Is.EqualTo(45));
503503

504-
Assert.That(prop.nestedEnum(), Is.EqualTo(5));
505-
Assert.That(prop.nestedEnum(55), Is.EqualTo(55));
504+
Assert.That(prop.NestedEnum(), Is.EqualTo(5));
505+
Assert.That(prop.NestedEnum(55), Is.EqualTo(55));
506506
}
507507
}
508508

0 commit comments

Comments
 (0)