diff --git a/src/Generator/Passes/HandleDefaultParamValuesPass.cs b/src/Generator/Passes/HandleDefaultParamValuesPass.cs index 3e02be28..4d5e97b0 100644 --- a/src/Generator/Passes/HandleDefaultParamValuesPass.cs +++ b/src/Generator/Passes/HandleDefaultParamValuesPass.cs @@ -3,7 +3,6 @@ using System.Linq; using System.Text.RegularExpressions; using CppSharp.AST; using CppSharp.AST.Extensions; -using CppSharp.Generators.CLI; using CppSharp.Generators.CSharp; using CppSharp.Types; using Type = CppSharp.AST.Type; @@ -15,7 +14,19 @@ namespace CppSharp.Passes private static readonly Regex regexFunctionParams = new Regex(@"\(?(.+)\)?", RegexOptions.Compiled); private static readonly Regex regexDoubleColon = new Regex(@"\w+::", RegexOptions.Compiled); private static readonly Regex regexName = new Regex(@"(\w+)", RegexOptions.Compiled); - private static readonly Regex regexCtor = new Regex(@"^(\w+)\s*\(\w*\)$", RegexOptions.Compiled); + private static readonly Regex regexCtor = new Regex(@"^([\w<,>:]+)\s*(\(\w*\))$", RegexOptions.Compiled); + + public HandleDefaultParamValuesPass() + { + Options.VisitFunctionParameters = false; + } + + public override bool VisitTranslationUnit(TranslationUnit unit) + { + if (!unit.IsGenerated) + return false; + return base.VisitTranslationUnit(unit); + } public override bool VisitFunctionDecl(Function function) { @@ -62,13 +73,24 @@ namespace CppSharp.Passes } } - private static bool CheckForDefaultPointer(Type desugared, Parameter parameter) + private bool CheckForDefaultPointer(Type desugared, Parameter parameter) { if (desugared.IsPointer()) { // IntPtr.Zero is not a constant - parameter.DefaultArgument.String = desugared.IsPointerToPrimitiveType(PrimitiveType.Void) ? - "new global::System.IntPtr()" : "null"; + if (desugared.IsPointerToPrimitiveType(PrimitiveType.Void)) + { + parameter.DefaultArgument.String = "new global::System.IntPtr()"; + return true; + } + Class @class; + if (desugared.GetFinalPointee().TryGetClass(out @class) && @class.IsValueType) + { + parameter.DefaultArgument.String = string.Format("new {0}()", + new CSharpTypePrinter(Driver).VisitClassDecl(@class)); + return true; + } + parameter.DefaultArgument.String = "null"; return true; } return false; @@ -90,27 +112,13 @@ namespace CppSharp.Passes TypeMap typeMap; if (Driver.TypeDatabase.FindTypeMap(decl, type, out typeMap)) { - Type typeInSignature; - string mappedTo; - if (Driver.Options.IsCSharpGenerator) + var typePrinterContext = new CSharpTypePrinterContext { - var typePrinterContext = new CSharpTypePrinterContext - { - CSharpKind = CSharpTypePrinterContextKind.Managed, - Type = type - }; - typeInSignature = typeMap.CSharpSignatureType(typePrinterContext).SkipPointerRefs(); - mappedTo = typeMap.CSharpSignature(typePrinterContext); - } - else - { - var typePrinterContext = new CLITypePrinterContext - { - Type = type - }; - typeInSignature = typeMap.CLISignatureType(typePrinterContext).SkipPointerRefs(); - mappedTo = typeMap.CLISignature(typePrinterContext); - } + CSharpKind = CSharpTypePrinterContextKind.Managed, + Type = type + }; + var typeInSignature = typeMap.CSharpSignatureType(typePrinterContext).SkipPointerRefs(); + var mappedTo = typeMap.CSharpSignature(typePrinterContext); Enumeration @enum; if (typeInSignature.TryGetEnum(out @enum)) { diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index 0edf818b..50d29068 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -362,6 +362,10 @@ void MethodsWithDefaultValues::rotate4x4Matrix(float angle, float x, float y, fl { } +void MethodsWithDefaultValues::defaultPointerToValueType(QGenericArgument* pointer) +{ +} + int MethodsWithDefaultValues::getA() { return m_foo.A; diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index f7944290..c7163e69 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -278,6 +278,7 @@ public: void defaultIntWithLongExpression(unsigned int i = DEFAULT_INT); void defaultRefTypeEnumImplicitCtor(const QColor &fillColor = Qt::white); void rotate4x4Matrix(float angle, float x, float y, float z = 0.0f); + void defaultPointerToValueType(QGenericArgument* pointer = 0); int getA(); private: Foo m_foo;