Browse Source

Prevented duplication when a class and its base each have a field with the same name.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/539/head
Dimitar Dobrev 10 years ago
parent
commit
ea8e167e6e
  1. 8
      src/AST/Field.cs
  2. 12
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  3. 29
      src/Generator/Passes/CheckDuplicatedNamesPass.cs
  4. 1
      tests/CSharpTemp/CSharpTemp.Tests.cs
  5. 4
      tests/CSharpTemp/CSharpTemp.h

8
src/AST/Field.cs

@ -22,6 +22,12 @@ namespace CppSharp.AST
public uint BitWidth { get; set; } public uint BitWidth { get; set; }
public string InternalName
{
get { return internalName ?? (internalName = OriginalName); }
set { internalName = value; }
}
public Field() public Field()
{ {
Offset = 0; Offset = 0;
@ -49,5 +55,7 @@ namespace CppSharp.AST
{ {
return visitor.VisitFieldDecl(this); return visitor.VisitFieldDecl(this);
} }
private string internalName;
} }
} }

12
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -715,7 +715,7 @@ namespace CppSharp.Generators.CSharp
!(@class != null && @class.IsUnion)) || (@class != null && @class.TranslationUnit.IsSystemHeader)) !(@class != null && @class.IsUnion)) || (@class != null && @class.TranslationUnit.IsSystemHeader))
return; return;
var safeIdentifier = Helpers.SafeIdentifier(field.OriginalName); var safeIdentifier = Helpers.SafeIdentifier(field.InternalName);
if(safeIdentifier.All(c => c.Equals('_'))) if(safeIdentifier.All(c => c.Equals('_')))
{ {
@ -863,7 +863,7 @@ namespace CppSharp.Generators.CSharp
string arrPtrIden = Helpers.SafeIdentifier("arrPtr"); string arrPtrIden = Helpers.SafeIdentifier("arrPtr");
WriteLine(string.Format("fixed ({0} {1} = {2}.{3})", WriteLine(string.Format("fixed ({0} {1} = {2}.{3})",
type.Replace("[]", "*"), arrPtrIden, Helpers.InstanceField, type.Replace("[]", "*"), arrPtrIden, Helpers.InstanceField,
Helpers.SafeIdentifier(field.OriginalName))); Helpers.SafeIdentifier(field.InternalName)));
WriteStartBraceIndent(); WriteStartBraceIndent();
ctx.ReturnVarName = arrPtrIden; ctx.ReturnVarName = arrPtrIden;
} }
@ -874,7 +874,7 @@ namespace CppSharp.Generators.CSharp
? Helpers.InstanceField ? Helpers.InstanceField
: string.Format("((Internal*) {0})", Helpers.InstanceIdentifier), : string.Format("((Internal*) {0})", Helpers.InstanceIdentifier),
@class.IsValueType ? "." : "->", @class.IsValueType ? "." : "->",
Helpers.SafeIdentifier(field.OriginalName)); Helpers.SafeIdentifier(field.InternalName));
} }
param.Visit(marshal); param.Visit(marshal);
@ -976,7 +976,7 @@ namespace CppSharp.Generators.CSharp
? Helpers.InstanceField ? Helpers.InstanceField
: string.Format("((Internal*) {0})", Helpers.InstanceIdentifier), : string.Format("((Internal*) {0})", Helpers.InstanceIdentifier),
@class.IsValueType ? "." : "->", @class.IsValueType ? "." : "->",
Helpers.SafeIdentifier(field.OriginalName)), Helpers.SafeIdentifier(field.InternalName)),
ReturnType = decl.QualifiedType ReturnType = decl.QualifiedType
}; };
@ -989,7 +989,7 @@ namespace CppSharp.Generators.CSharp
string arrPtrIden = Helpers.SafeIdentifier("arrPtr"); string arrPtrIden = Helpers.SafeIdentifier("arrPtr");
WriteLine(string.Format("fixed ({0} {1} = {2}.{3})", WriteLine(string.Format("fixed ({0} {1} = {2}.{3})",
type.Replace("[]","*"), arrPtrIden, Helpers.InstanceField, type.Replace("[]","*"), arrPtrIden, Helpers.InstanceField,
Helpers.SafeIdentifier(field.OriginalName))); Helpers.SafeIdentifier(field.InternalName)));
WriteStartBraceIndent(); WriteStartBraceIndent();
ctx.ReturnVarName = arrPtrIden; ctx.ReturnVarName = arrPtrIden;
} }
@ -1142,7 +1142,7 @@ namespace CppSharp.Generators.CSharp
{ {
GenerateClassField(prop.Field); GenerateClassField(prop.Field);
WriteLine("private bool {0};", WriteLine("private bool {0};",
GeneratedIdentifier(string.Format("{0}Initialised", prop.Field.OriginalName))); GeneratedIdentifier(string.Format("{0}Initialised", prop.Field.InternalName)));
} }
GenerateDeclarationCommon(prop); GenerateDeclarationCommon(prop);

29
src/Generator/Passes/CheckDuplicatedNamesPass.cs

@ -100,18 +100,6 @@ namespace CppSharp.Passes
names = new Dictionary<string, DeclarationName>(); names = new Dictionary<string, DeclarationName>();
} }
public override bool VisitFieldDecl(Field decl)
{
if (!VisitDeclaration(decl))
return false;
if (ASTUtils.CheckIgnoreField(decl))
return false;
CheckDuplicate(decl);
return false;
}
public override bool VisitProperty(Property decl) public override bool VisitProperty(Property decl)
{ {
if (!VisitDeclaration(decl)) if (!VisitDeclaration(decl))
@ -165,8 +153,12 @@ namespace CppSharp.Passes
foreach (var function in @class.Functions) foreach (var function in @class.Functions)
VisitFunctionDecl(function); VisitFunctionDecl(function);
foreach (var field in @class.Fields) foreach (var fields in GetAllFields(@class).GroupBy(f => f.OriginalName).Where(
VisitFieldDecl(field); g => !string.IsNullOrEmpty(g.Key)).Select(g => g.ToList()))
{
for (var i = 1; i < fields.Count; i++)
fields[i].InternalName = fields[i].OriginalName + i;
}
foreach (var property in @class.Properties) foreach (var property in @class.Properties)
VisitProperty(property); VisitProperty(property);
@ -183,6 +175,15 @@ namespace CppSharp.Passes
return false; return false;
} }
private static IEnumerable<Field> GetAllFields(Class @class, List<Field> fields = null)
{
fields = fields ?? new List<Field>();
foreach (var @base in @class.Bases.Where(b => b.IsClass))
GetAllFields(@base.Class, fields);
fields.AddRange(@class.Fields);
return fields;
}
void CheckDuplicate(Declaration decl) void CheckDuplicate(Declaration decl)
{ {
if (decl.IsDependent || !decl.IsGenerated) if (decl.IsDependent || !decl.IsGenerated)

1
tests/CSharpTemp/CSharpTemp.Tests.cs

@ -102,6 +102,7 @@ public class CSharpTempTests : 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);
} }
} }

4
tests/CSharpTemp/CSharpTemp.h

@ -93,6 +93,8 @@ public:
Baz(); Baz();
int P;
int takesQux(const Qux& qux); int takesQux(const Qux& qux);
Qux returnQux(); Qux returnQux();
void setMethod(int value); void setMethod(int value);
@ -101,7 +103,7 @@ public:
FunctionTypedef functionTypedef; FunctionTypedef functionTypedef;
}; };
Baz::Baz() {} Baz::Baz() : P(5) {}
struct QArrayData struct QArrayData
{ {

Loading…
Cancel
Save