From 88a88599e7a8ea84876672f419ea1abfdc8ca28f Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Sat, 23 Aug 2014 01:22:52 +0300 Subject: [PATCH 1/5] Fixed the wrapping of bit masks in default arguments. Signed-off-by: Dimitar Dobrev Conflicts: src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs --- src/AST/Statement.cs | 3 ++- src/Core/Parser/ASTConverter.cs | 3 +++ src/CppParser/AST.h | 3 ++- src/CppParser/Bindings/CLI/AST.h | 3 ++- .../CSharp/i686-apple-darwin12.4.0/AST.cs | 3 ++- .../Bindings/CSharp/i686-pc-win32-msvc/AST.cs | 3 ++- .../Bindings/CSharp/x86_64-linux-gnu/AST.cs | 3 ++- src/CppParser/Parser.cpp | 3 +++ .../Passes/HandleDefaultParamValuesPass.cs | 6 +++--- tests/CSharpTemp/CSharpTemp.cpp | 10 ++++++++++ tests/CSharpTemp/CSharpTemp.h | 20 +++++++++++++++++++ 11 files changed, 51 insertions(+), 9 deletions(-) diff --git a/src/AST/Statement.cs b/src/AST/Statement.cs index b1ae1985..630565c9 100644 --- a/src/AST/Statement.cs +++ b/src/AST/Statement.cs @@ -4,7 +4,8 @@ { Any, DeclarationReference, - ConstructorReference + ConstructorReference, + CXXOperatorCall } public abstract class Statement diff --git a/src/Core/Parser/ASTConverter.cs b/src/Core/Parser/ASTConverter.cs index 6a09a77f..eca866a6 100644 --- a/src/Core/Parser/ASTConverter.cs +++ b/src/Core/Parser/ASTConverter.cs @@ -855,6 +855,9 @@ namespace CppSharp case StatementClass.CXXConstructExprClass: expression.Class = AST.StatementClass.ConstructorReference; break; + case StatementClass.CXXOperatorCallExpr: + expression.Class = AST.StatementClass.CXXOperatorCall; + break; } return expression; } diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index 98a7024c..05e6ee19 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -459,7 +459,8 @@ enum class StatementClass { Any, DeclRefExprClass, - CXXConstructExprClass + CXXConstructExprClass, + CXXOperatorCallExpr }; class CS_API Statement diff --git a/src/CppParser/Bindings/CLI/AST.h b/src/CppParser/Bindings/CLI/AST.h index 4403ad43..da6964c7 100644 --- a/src/CppParser/Bindings/CLI/AST.h +++ b/src/CppParser/Bindings/CLI/AST.h @@ -211,7 +211,8 @@ namespace CppSharp { Any = 0, DeclRefExprClass = 1, - CXXConstructExprClass = 2 + CXXConstructExprClass = 2, + CXXOperatorCallExpr = 3 }; public enum struct TemplateSpecializationKind diff --git a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs index 430375ff..3d80a940 100644 --- a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs @@ -135,7 +135,8 @@ namespace CppSharp { Any = 0, DeclRefExprClass = 1, - CXXConstructExprClass = 2 + CXXConstructExprClass = 2, + CXXOperatorCallExpr = 3 } public enum TemplateSpecializationKind diff --git a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs index 9575d83f..06c0fc99 100644 --- a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs @@ -135,7 +135,8 @@ namespace CppSharp { Any = 0, DeclRefExprClass = 1, - CXXConstructExprClass = 2 + CXXConstructExprClass = 2, + CXXOperatorCallExpr = 3 } public enum TemplateSpecializationKind diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs index c307baa5..727d7aae 100644 --- a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs +++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs @@ -135,7 +135,8 @@ namespace CppSharp { Any = 0, DeclRefExprClass = 1, - CXXConstructExprClass = 2 + CXXConstructExprClass = 2, + CXXOperatorCallExpr = 3 } public enum TemplateSpecializationKind diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index cde23958..13934c38 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -2466,6 +2466,9 @@ AST::Expression* Parser::WalkStatement(clang::Stmt* Statement) case Stmt::CXXStaticCastExprClass: case Stmt::ImplicitCastExprClass: return WalkStatement(cast(Statement)->getSubExprAsWritten()); + case Stmt::CXXOperatorCallExprClass: + return new AST::Expression(GetStringFromStatement(Statement), StatementClass::CXXOperatorCallExpr, + WalkDeclaration(cast(Statement)->getCalleeDecl())); case Stmt::CXXConstructExprClass: case Stmt::CXXTemporaryObjectExprClass: { diff --git a/src/Generator/Passes/HandleDefaultParamValuesPass.cs b/src/Generator/Passes/HandleDefaultParamValuesPass.cs index 47f30034..8dc8a6e5 100644 --- a/src/Generator/Passes/HandleDefaultParamValuesPass.cs +++ b/src/Generator/Passes/HandleDefaultParamValuesPass.cs @@ -13,7 +13,7 @@ namespace CppSharp.Passes { public class HandleDefaultParamValuesPass : TranslationUnitPass { - private static readonly Regex regexFunctionParams = new Regex(@"\((.+)\)", RegexOptions.Compiled); + 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); @@ -120,8 +120,8 @@ namespace CppSharp.Passes return true; } - var call = parameter.DefaultArgument.Declaration as Method; - if (call != null && call.IsConstructor) + var call = parameter.DefaultArgument.Declaration as Function; + if (call != null) { string @params = regexFunctionParams.Match(parameter.DefaultArgument.String).Groups[1].Value; diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index ac9cbfc4..c665bf3e 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -222,6 +222,16 @@ TestCopyConstructorVal::TestCopyConstructorVal(const TestCopyConstructorVal& oth B = other.B; } +Flags operator|(Flags lhs, Flags rhs) +{ + return static_cast(static_cast(lhs) | static_cast(rhs)); +} + +UntypedFlags operator|(UntypedFlags lhs, UntypedFlags rhs) +{ + return static_cast(static_cast(lhs) | static_cast(rhs)); +} + void MethodsWithDefaultValues::DefaultPointer(Foo *ptr) { } diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 8fc93df2..9d5f2d44 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -187,6 +187,24 @@ struct DLL_API ValueType { }; +enum class Flags +{ + Flag1 = 1, + Flag2 = 2, + Flag3 = 4 +}; + +DLL_API Flags operator|(Flags lhs, Flags rhs); + +enum UntypedFlags +{ + Flag1 = 1, + Flag2 = 2, + Flag3 = 4 +}; + +UntypedFlags operator|(UntypedFlags lhs, UntypedFlags rhs); + class DLL_API MethodsWithDefaultValues { public: @@ -198,6 +216,8 @@ public: void DefaultRefTypeBeforeAndAfterOthers(int i = 5, Foo foo = Foo(), Bar::Items item = Bar::Item2, Baz baz = Baz()); void DefaultIntAssignedAnEnum(int i = Bar::Item1); void DefaultRefAssignedValue(const Foo& fooRef = Foo()); + void DefaultEnumAssignedBitwiseOr(Flags flags = Flags::Flag1 | Flags::Flag2); + void DefaultEnumAssignedBitwiseOrShort(UntypedFlags flags = Flag1 | Flag2); }; class DLL_API HasPrivateOverrideBase From d481cf807825358676b394bce9c82f9fb9f081f9 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Sat, 23 Aug 2014 19:07:25 +0300 Subject: [PATCH 2/5] Fixed the renaming of overloads generated because of default arguments. Signed-off-by: Dimitar Dobrev --- src/AST/Method.cs | 1 + src/Generator/Passes/RenamePass.cs | 8 ++++---- tests/CSharpTemp/CSharpTemp.cpp | 16 ++++++++-------- tests/CSharpTemp/CSharpTemp.h | 19 ++++++++++--------- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/AST/Method.cs b/src/AST/Method.cs index 557ba730..c2216eba 100644 --- a/src/AST/Method.cs +++ b/src/AST/Method.cs @@ -88,6 +88,7 @@ namespace CppSharp.AST IsImplicit = method.IsImplicit; IsOverride = method.IsOverride; IsProxy = method.IsProxy; + IsStatic = method.IsStatic; Kind = method.Kind; IsDefaultConstructor = method.IsDefaultConstructor; IsCopyConstructor = method.IsCopyConstructor; diff --git a/src/Generator/Passes/RenamePass.cs b/src/Generator/Passes/RenamePass.cs index cc13910e..6cd3eae7 100644 --- a/src/Generator/Passes/RenamePass.cs +++ b/src/Generator/Passes/RenamePass.cs @@ -13,11 +13,11 @@ namespace CppSharp.Passes /// public abstract class RenamePass : TranslationUnitPass { - public class ParameterMappedTypeComparer : IEqualityComparer + public class ParameterComparer : IEqualityComparer { public bool Equals(Parameter x, Parameter y) { - return x.QualifiedType == y.QualifiedType; + return x.QualifiedType == y.QualifiedType && x.GenerationKind == y.GenerationKind; } public int GetHashCode(Parameter obj) @@ -134,10 +134,10 @@ namespace CppSharp.Passes if (method != null) { return ((Class) method.Namespace).Methods.Where( - m => m.Parameters.SequenceEqual(function.Parameters, new ParameterMappedTypeComparer())); + m => m.Parameters.SequenceEqual(function.Parameters, new ParameterComparer())); } return function.Namespace.Functions.Where( - f => f.Parameters.SequenceEqual(function.Parameters, new ParameterMappedTypeComparer())); + f => f.Parameters.SequenceEqual(function.Parameters, new ParameterComparer())); } public override bool VisitEnumItem(Enumeration.Item item) diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index c665bf3e..a21a8aa1 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -232,35 +232,35 @@ UntypedFlags operator|(UntypedFlags lhs, UntypedFlags rhs) return static_cast(static_cast(lhs) | static_cast(rhs)); } -void MethodsWithDefaultValues::DefaultPointer(Foo *ptr) +void MethodsWithDefaultValues::defaultPointer(Foo *ptr) { } -void MethodsWithDefaultValues::DefaultValueType(ValueType bar) +void MethodsWithDefaultValues::defaultValueType(ValueType bar) { } -void MethodsWithDefaultValues::DefaultChar(char c) +void MethodsWithDefaultValues::defaultChar(char c) { } -void MethodsWithDefaultValues::DefaultRefTypeBeforeOthers(Foo foo, int i, Bar::Items item) +void MethodsWithDefaultValues::defaultRefTypeBeforeOthers(Foo foo, int i, Bar::Items item) { } -void MethodsWithDefaultValues::DefaultRefTypeAfterOthers(int i, Bar::Items item, Foo foo) +void MethodsWithDefaultValues::defaultRefTypeAfterOthers(int i, Bar::Items item, Foo foo) { } -void MethodsWithDefaultValues::DefaultRefTypeBeforeAndAfterOthers(int i, Foo foo, Bar::Items item, Baz baz) +void MethodsWithDefaultValues::defaultRefTypeBeforeAndAfterOthers(int i, Foo foo, Bar::Items item, Baz baz) { } -void MethodsWithDefaultValues::DefaultIntAssignedAnEnum(int i) +void MethodsWithDefaultValues::defaultIntAssignedAnEnum(int i) { } -void MethodsWithDefaultValues::DefaultRefAssignedValue(const Foo &fooRef) +void MethodsWithDefaultValues::defaultRefAssignedValue(const Foo &fooRef) { } diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 9d5f2d44..7d161481 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -208,16 +208,17 @@ UntypedFlags operator|(UntypedFlags lhs, UntypedFlags rhs); class DLL_API MethodsWithDefaultValues { public: - void DefaultPointer(Foo* ptr = 0); - void DefaultValueType(ValueType bar = ValueType()); - void DefaultChar(char c = 'a'); - void DefaultRefTypeBeforeOthers(Foo foo = Foo(), int i = 5, Bar::Items item = Bar::Item2); - void DefaultRefTypeAfterOthers(int i = 5, Bar::Items item = Bar::Item2, Foo foo = Foo()); - void DefaultRefTypeBeforeAndAfterOthers(int i = 5, Foo foo = Foo(), Bar::Items item = Bar::Item2, Baz baz = Baz()); - void DefaultIntAssignedAnEnum(int i = Bar::Item1); + void defaultPointer(Foo* ptr = 0); + void defaultValueType(ValueType bar = ValueType()); + void defaultChar(char c = 'a'); + void defaultRefTypeBeforeOthers(Foo foo = Foo(), int i = 5, Bar::Items item = Bar::Item2); + void defaultRefTypeAfterOthers(int i = 5, Bar::Items item = Bar::Item2, Foo foo = Foo()); + void defaultRefTypeBeforeAndAfterOthers(int i = 5, Foo foo = Foo(), Bar::Items item = Bar::Item2, Baz baz = Baz()); + void defaultIntAssignedAnEnum(int i = Bar::Item1); + void defaultRefAssignedValue(const Foo& fooRef = Foo()); void DefaultRefAssignedValue(const Foo& fooRef = Foo()); - void DefaultEnumAssignedBitwiseOr(Flags flags = Flags::Flag1 | Flags::Flag2); - void DefaultEnumAssignedBitwiseOrShort(UntypedFlags flags = Flag1 | Flag2); + void defaultEnumAssignedBitwiseOr(Flags flags = Flags::Flag1 | Flags::Flag2); + void defaultEnumAssignedBitwiseOrShort(UntypedFlags flags = Flag1 | Flag2); }; class DLL_API HasPrivateOverrideBase From 3b8873022b0d0e3decd3cb479240c24dd046d1e0 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Sun, 24 Aug 2014 01:03:12 +0300 Subject: [PATCH 3/5] Handled built-in binary operators in default arguments. Signed-off-by: Dimitar Dobrev --- src/AST/Statement.cs | 1 + src/Core/Parser/ASTConverter.cs | 3 +++ src/CppParser/AST.h | 1 + src/CppParser/Bindings/CLI/AST.h | 7 ++++--- .../Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs | 7 ++++--- src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs | 7 ++++--- src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs | 7 ++++--- src/CppParser/Parser.cpp | 4 +++- src/Generator/Passes/HandleDefaultParamValuesPass.cs | 5 ++--- 9 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/AST/Statement.cs b/src/AST/Statement.cs index 630565c9..3f8e1a68 100644 --- a/src/AST/Statement.cs +++ b/src/AST/Statement.cs @@ -3,6 +3,7 @@ public enum StatementClass { Any, + BinaryOperator, DeclarationReference, ConstructorReference, CXXOperatorCall diff --git a/src/Core/Parser/ASTConverter.cs b/src/Core/Parser/ASTConverter.cs index eca866a6..4197a82d 100644 --- a/src/Core/Parser/ASTConverter.cs +++ b/src/Core/Parser/ASTConverter.cs @@ -849,6 +849,9 @@ namespace CppSharp expression.String = statement.String; switch (statement.Class) { + case StatementClass.BinaryOperator: + expression.Class = AST.StatementClass.BinaryOperator; + break; case StatementClass.DeclRefExprClass: expression.Class = AST.StatementClass.DeclarationReference; break; diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index 05e6ee19..fed306ea 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -458,6 +458,7 @@ public: enum class StatementClass { Any, + BinaryOperator, DeclRefExprClass, CXXConstructExprClass, CXXOperatorCallExpr diff --git a/src/CppParser/Bindings/CLI/AST.h b/src/CppParser/Bindings/CLI/AST.h index da6964c7..47e2c2ef 100644 --- a/src/CppParser/Bindings/CLI/AST.h +++ b/src/CppParser/Bindings/CLI/AST.h @@ -210,9 +210,10 @@ namespace CppSharp public enum struct StatementClass { Any = 0, - DeclRefExprClass = 1, - CXXConstructExprClass = 2, - CXXOperatorCallExpr = 3 + BinaryOperator = 1, + DeclRefExprClass = 2, + CXXConstructExprClass = 3, + CXXOperatorCallExpr = 4 }; public enum struct TemplateSpecializationKind diff --git a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs index 3d80a940..321b67c4 100644 --- a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs @@ -134,9 +134,10 @@ namespace CppSharp public enum StatementClass { Any = 0, - DeclRefExprClass = 1, - CXXConstructExprClass = 2, - CXXOperatorCallExpr = 3 + BinaryOperator = 1, + DeclRefExprClass = 2, + CXXConstructExprClass = 3, + CXXOperatorCallExpr = 4 } public enum TemplateSpecializationKind diff --git a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs index 06c0fc99..559495c1 100644 --- a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs @@ -134,9 +134,10 @@ namespace CppSharp public enum StatementClass { Any = 0, - DeclRefExprClass = 1, - CXXConstructExprClass = 2, - CXXOperatorCallExpr = 3 + BinaryOperator = 1, + DeclRefExprClass = 2, + CXXConstructExprClass = 3, + CXXOperatorCallExpr = 4 } public enum TemplateSpecializationKind diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs index 727d7aae..5afc3b93 100644 --- a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs +++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs @@ -134,9 +134,10 @@ namespace CppSharp public enum StatementClass { Any = 0, - DeclRefExprClass = 1, - CXXConstructExprClass = 2, - CXXOperatorCallExpr = 3 + BinaryOperator = 1, + DeclRefExprClass = 2, + CXXConstructExprClass = 3, + CXXOperatorCallExpr = 4 } public enum TemplateSpecializationKind diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 13934c38..a60873d1 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -2455,6 +2455,8 @@ AST::Expression* Parser::WalkStatement(clang::Stmt* Statement) switch (Statement->getStmtClass()) { + case Stmt::BinaryOperatorClass: + return new AST::Expression(GetStringFromStatement(Statement), StatementClass::BinaryOperator); case Stmt::DeclRefExprClass: return new AST::Expression(GetStringFromStatement(Statement), StatementClass::DeclRefExprClass, WalkDeclaration(cast(Statement)->getDecl())); @@ -2473,7 +2475,7 @@ AST::Expression* Parser::WalkStatement(clang::Stmt* Statement) case Stmt::CXXTemporaryObjectExprClass: { auto ConstructorExpr = cast(Statement); - if (ConstructorExpr->getNumArgs() > 0) + if (ConstructorExpr->getNumArgs() == 1) { auto Arg = ConstructorExpr->getArg(0); auto TemporaryExpr = dyn_cast(Arg); diff --git a/src/Generator/Passes/HandleDefaultParamValuesPass.cs b/src/Generator/Passes/HandleDefaultParamValuesPass.cs index 8dc8a6e5..332a9dff 100644 --- a/src/Generator/Passes/HandleDefaultParamValuesPass.cs +++ b/src/Generator/Passes/HandleDefaultParamValuesPass.cs @@ -121,10 +121,9 @@ namespace CppSharp.Passes } var call = parameter.DefaultArgument.Declaration as Function; - if (call != null) + if (call != null || parameter.DefaultArgument.Class == StatementClass.BinaryOperator) { - string @params = - regexFunctionParams.Match(parameter.DefaultArgument.String).Groups[1].Value; + string @params = regexFunctionParams.Match(parameter.DefaultArgument.String).Groups[1].Value; if (@params.Contains("::")) parameter.DefaultArgument.String = regexDoubleColon.Replace(@params, desugared + "."); else From 95547dbec896ebfcdbb6ce9909db864d57dafc3f Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Sun, 24 Aug 2014 15:19:08 +0300 Subject: [PATCH 4/5] Fixed default arguments with enums directly declared in headers. Signed-off-by: Dimitar Dobrev --- src/Generator/Passes/HandleDefaultParamValuesPass.cs | 6 ++++-- tests/CSharpTemp/CSharpTemp.cpp | 4 ++++ tests/CSharpTemp/CSharpTemp.h | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Generator/Passes/HandleDefaultParamValuesPass.cs b/src/Generator/Passes/HandleDefaultParamValuesPass.cs index 332a9dff..1d741c45 100644 --- a/src/Generator/Passes/HandleDefaultParamValuesPass.cs +++ b/src/Generator/Passes/HandleDefaultParamValuesPass.cs @@ -114,9 +114,11 @@ namespace CppSharp.Passes var enumItem = parameter.DefaultArgument.Declaration as Enumeration.Item; if (enumItem != null) { - parameter.DefaultArgument.String = string.Format("{0}{1}.{2}.{3}", + parameter.DefaultArgument.String = string.Format("{0}{1}{2}.{3}", desugared.IsPrimitiveType() ? "(int) " : string.Empty, - enumItem.Namespace.Namespace.Name, enumItem.Namespace.Name, enumItem.Name); + string.IsNullOrEmpty(enumItem.Namespace.Namespace.Name) + ? string.Empty + : enumItem.Namespace.Namespace.Name + ".", enumItem.Namespace.Name, enumItem.Name); return true; } diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index a21a8aa1..fc70487f 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -264,6 +264,10 @@ void MethodsWithDefaultValues::defaultRefAssignedValue(const Foo &fooRef) { } +void MethodsWithDefaultValues::defaultMappedToEnum(QFlags qFlags) +{ +} + void HasPrivateOverrideBase::privateOverride(int i) { } diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 7d161481..c7798a40 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -219,6 +219,7 @@ public: void DefaultRefAssignedValue(const Foo& fooRef = Foo()); void defaultEnumAssignedBitwiseOr(Flags flags = Flags::Flag1 | Flags::Flag2); void defaultEnumAssignedBitwiseOrShort(UntypedFlags flags = Flag1 | Flag2); + void defaultMappedToEnum(QFlags qFlags = Flags::Flag1); }; class DLL_API HasPrivateOverrideBase From de4c551fda916f7ad5418a974a2090c3cbaac28f Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Sun, 24 Aug 2014 15:51:18 +0300 Subject: [PATCH 5/5] Worked around a specific default argument construct used in Qt. Signed-off-by: Dimitar Dobrev --- src/CppParser/Parser.cpp | 8 ++++++-- tests/CSharpTemp/CSharpTemp.cpp | 5 +++++ tests/CSharpTemp/CSharpTemp.cs | 1 + tests/CSharpTemp/CSharpTemp.h | 9 +++++++++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index a60873d1..eb323e23 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -2479,8 +2479,12 @@ AST::Expression* Parser::WalkStatement(clang::Stmt* Statement) { auto Arg = ConstructorExpr->getArg(0); auto TemporaryExpr = dyn_cast(Arg); - if (TemporaryExpr && isa(TemporaryExpr->GetTemporaryExpr())) - return WalkStatement(TemporaryExpr->GetTemporaryExpr()); + if (TemporaryExpr) + { + auto Cast = dyn_cast(TemporaryExpr->GetTemporaryExpr()); + if (Cast && Cast->getSubExprAsWritten()->getStmtClass() != Stmt::IntegerLiteralClass) + return WalkStatement(Cast->getSubExprAsWritten()); + } } return new AST::Expression(GetStringFromStatement(Statement), StatementClass::CXXConstructExprClass, WalkDeclaration(ConstructorExpr->getConstructor())); diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index fc70487f..3f022a7c 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -232,6 +232,11 @@ UntypedFlags operator|(UntypedFlags lhs, UntypedFlags rhs) return static_cast(static_cast(lhs) | static_cast(rhs)); } +QGenericArgument::QGenericArgument(const char *name) +{ + _name = name; +} + void MethodsWithDefaultValues::defaultPointer(Foo *ptr) { } diff --git a/tests/CSharpTemp/CSharpTemp.cs b/tests/CSharpTemp/CSharpTemp.cs index 4083e326..2efe4a09 100644 --- a/tests/CSharpTemp/CSharpTemp.cs +++ b/tests/CSharpTemp/CSharpTemp.cs @@ -81,6 +81,7 @@ namespace CppSharp.Tests public override void Preprocess(Driver driver, ASTContext ctx) { ctx.SetClassAsValueType("TestCopyConstructorVal"); + ctx.SetClassAsValueType("QGenericArgument"); } public override void Postprocess(Driver driver, ASTContext ctx) diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index c7798a40..7df4f644 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -205,6 +205,14 @@ enum UntypedFlags UntypedFlags operator|(UntypedFlags lhs, UntypedFlags rhs); +struct QGenericArgument +{ +public: + QGenericArgument(const char* name = 0); +private: + const char* _name; +}; + class DLL_API MethodsWithDefaultValues { public: @@ -219,6 +227,7 @@ public: void DefaultRefAssignedValue(const Foo& fooRef = Foo()); void defaultEnumAssignedBitwiseOr(Flags flags = Flags::Flag1 | Flags::Flag2); void defaultEnumAssignedBitwiseOrShort(UntypedFlags flags = Flag1 | Flag2); + void defaultNonEmptyCtor(QGenericArgument arg = QGenericArgument(0)); void defaultMappedToEnum(QFlags qFlags = Flags::Flag1); };