From 79883199f5803c2113d871318bba54502d05c523 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Tue, 12 Nov 2013 12:39:07 +0200 Subject: [PATCH] Prevented the renaming of constructors if there is duplication of names. Signed-off-by: Dimitar Dobrev --- .../Passes/CheckDuplicatedNamesPass.cs | 7 ++++- src/Generator/Types/TypeMap.cs | 28 +++++++++---------- tests/CSharpTemp/CSharpTemp.Tests.cs | 2 +- tests/CSharpTemp/CSharpTemp.cpp | 10 +++++++ tests/CSharpTemp/CSharpTemp.cs | 3 +- tests/CSharpTemp/CSharpTemp.h | 3 ++ 6 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/Generator/Passes/CheckDuplicatedNamesPass.cs b/src/Generator/Passes/CheckDuplicatedNamesPass.cs index 9a758100..88748b79 100644 --- a/src/Generator/Passes/CheckDuplicatedNamesPass.cs +++ b/src/Generator/Passes/CheckDuplicatedNamesPass.cs @@ -46,7 +46,7 @@ namespace CppSharp.Passes return true; } - private bool UpdateName(Function method) + private bool UpdateName(Method method) { var @params = method.Parameters.Where(p => p.Kind != ParameterKind.IndirectReturnType) .Select(p => p.QualifiedType.ToString()); @@ -72,6 +72,11 @@ namespace CppSharp.Passes Driver.Diagnostics.EmitWarning("Duplicate operator {0} ignored", method.Name); method.ExplicityIgnored = true; } + else if (method.IsConstructor) + { + Driver.Diagnostics.EmitWarning("Duplicate constructor {0} ignored", method.Name); + method.ExplicityIgnored = true; + } else method.Name += methodCount.ToString(CultureInfo.InvariantCulture); return true; diff --git a/src/Generator/Types/TypeMap.cs b/src/Generator/Types/TypeMap.cs index d1e464d6..fd53b3d2 100644 --- a/src/Generator/Types/TypeMap.cs +++ b/src/Generator/Types/TypeMap.cs @@ -135,19 +135,6 @@ namespace CppSharp.Types { var typePrinter = new CppTypePrinter(this); - if (FindTypeMap(type.Visit(typePrinter), out typeMap)) - { - typeMap.Type = type; - return true; - } - - typePrinter.PrintLocalName = true; - if (FindTypeMap(type.Visit(typePrinter), out typeMap)) - { - typeMap.Type = type; - return true; - } - TemplateSpecializationType template = type as TemplateSpecializationType; if (template != null) { @@ -156,7 +143,7 @@ namespace CppSharp.Types typeMap.Type = type; return true; } - typePrinter.PrintLocalName = false; + typePrinter.PrintLocalName = true; if (FindTypeMap(template.Template.TemplatedDecl.Visit(typePrinter), out typeMap)) { typeMap.Type = type; @@ -164,6 +151,19 @@ namespace CppSharp.Types } } + if (FindTypeMap(type.Visit(typePrinter), out typeMap)) + { + typeMap.Type = type; + return true; + } + + typePrinter.PrintLocalName = false; + if (FindTypeMap(type.Visit(typePrinter), out typeMap)) + { + typeMap.Type = type; + return true; + } + return false; } diff --git a/tests/CSharpTemp/CSharpTemp.Tests.cs b/tests/CSharpTemp/CSharpTemp.Tests.cs index a492411c..471b4c88 100644 --- a/tests/CSharpTemp/CSharpTemp.Tests.cs +++ b/tests/CSharpTemp/CSharpTemp.Tests.cs @@ -68,7 +68,7 @@ public class CSharpTempTests Assert.That(proprietor.Value, Is.EqualTo(20)); proprietor.Prop = 50; Assert.That(proprietor.Prop, Is.EqualTo(50)); - var p = new P(); + var p = new P(null); p.Value = 20; Assert.That(p.Value, Is.EqualTo(30)); p.Prop = 50; diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index 28dc0ea1..0176736d 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -150,6 +150,16 @@ void ComplexType::takesQFlags(const QFlags f) } +P::P(const Qux &qux) +{ + +} + +P::P(Qux *qux) +{ + +} + ComplexType P::complexType() { return m_complexType; diff --git a/tests/CSharpTemp/CSharpTemp.cs b/tests/CSharpTemp/CSharpTemp.cs index f841894b..bb473b11 100644 --- a/tests/CSharpTemp/CSharpTemp.cs +++ b/tests/CSharpTemp/CSharpTemp.cs @@ -12,7 +12,8 @@ namespace CppSharp.Tests { public override string CSharpSignature(CSharpTypePrinterContext ctx) { - TemplateArgument templateArgument = ((TemplateSpecializationType) ctx.Type.Desugar()).Arguments[0]; + TemplateArgument templateArgument = + ((TemplateSpecializationType) ctx.Type.Desugar()).Arguments[0]; return templateArgument.Type.Type.ToString(); } diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index af1bf615..2adec6eb 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -113,6 +113,9 @@ public: class DLL_API P : Proprietor { public: + P(const Qux& qux); + P(Qux* qux); + virtual void setValue(int value); virtual long prop();