Browse Source

The unique name set by the CleanInvalidDeclNames pass will now truly be unique across translation units.

pull/229/head
Elias Holzer 11 years ago
parent
commit
d1a3141f5b
  1. 15
      src/Generator.Tests/Passes/TestPasses.cs
  2. 22
      src/Generator/Passes/CleanInvalidDeclNamesPass.cs
  3. 9
      tests/Native/Enums.h
  4. 8
      tests/Native/Passes.h

15
src/Generator.Tests/Passes/TestPasses.cs

@ -1,4 +1,5 @@
using System.Linq; using System.Linq;
using CppSharp;
using CppSharp.Passes; using CppSharp.Passes;
using NUnit.Framework; using NUnit.Framework;
@ -115,6 +116,20 @@ namespace CppSharp.Generator.Tests.Passes
Assert.AreEqual(4, unnamedEnum2.Items[1].Value); Assert.AreEqual(4, unnamedEnum2.Items[1].Value);
} }
[Test]
public void TestUniqueNamesAcrossTranslationUnits()
{
passBuilder.AddPass(new CleanInvalidDeclNamesPass());
passBuilder.RunPasses(pass => pass.VisitLibrary(AstContext));
var unnamedEnum1 = AstContext.GetEnumWithMatchingItem("UnnamedEnumA1");
var unnamedEnum2 = AstContext.GetEnumWithMatchingItem("UnnamedEnumB1");
Assert.IsNotNull(unnamedEnum1);
Assert.IsNotNull(unnamedEnum2);
Assert.AreNotEqual(unnamedEnum1.Name, unnamedEnum2.Name);
}
[Test] [Test]
public void TestStructInheritance() public void TestStructInheritance()
{ {

22
src/Generator/Passes/CleanInvalidDeclNamesPass.cs

@ -68,23 +68,30 @@ namespace CppSharp.Passes
} }
} }
return base.VisitClassDecl(@class); var currentUniqueName = this.uniqueName;
this.uniqueName = 0;
var ret = base.VisitClassDecl(@class);
this.uniqueName = currentUniqueName;
return ret;
} }
public override bool VisitFunctionDecl(Function function) public override bool VisitFunctionDecl(Function function)
{ {
uniqueName = 0; var currentUniqueName = this.uniqueName;
this.uniqueName = 0;
var ret = base.VisitFunctionDecl(function); var ret = base.VisitFunctionDecl(function);
uniqueName = 0; this.uniqueName = currentUniqueName;
return ret; return ret;
} }
public override bool VisitEvent(Event @event) public override bool VisitEvent(Event @event)
{ {
uniqueName = 0; var currentUniqueName = this.uniqueName;
this.uniqueName = 0;
var ret = base.VisitEvent(@event); var ret = base.VisitEvent(@event);
uniqueName = 0; this.uniqueName = currentUniqueName;
return ret; return ret;
} }
@ -92,9 +99,10 @@ namespace CppSharp.Passes
public override bool VisitFunctionType(FunctionType type, public override bool VisitFunctionType(FunctionType type,
TypeQualifiers quals) TypeQualifiers quals)
{ {
uniqueName = 0; var currentUniqueName = this.uniqueName;
this.uniqueName = 0;
var ret = base.VisitFunctionType(type, quals); var ret = base.VisitFunctionType(type, quals);
uniqueName = 0; this.uniqueName = currentUniqueName;
return ret; return ret;
} }

9
tests/Native/Enums.h

@ -0,0 +1,9 @@
enum
{
UnnamedEnumA1,
EnumUnnamedA2
};
// This line will make sure that a visitor won't enumerate all enums across
// different translation units at once.
struct TestUniqueNames {};

8
tests/Native/Passes.h

@ -37,3 +37,11 @@ struct S2 : S1 { int F3; };
// Tests unnamed enums // Tests unnamed enums
enum { Unnamed_Enum_1_A = 1, Unnamed_Enum_1_B = 2 }; enum { Unnamed_Enum_1_A = 1, Unnamed_Enum_1_B = 2 };
enum { Unnamed_Enum_2_A = 3, Unnamed_Enum_2_B = 4 }; enum { Unnamed_Enum_2_A = 3, Unnamed_Enum_2_B = 4 };
// Tests unique name for unnamed enums across translation units
#include "Enums.h"
enum
{
UnnamedEnumB1,
EnumUnnamedB2
};
Loading…
Cancel
Save