From cf5cb69eab316da7a577a608ef676dee9a098b69 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Tue, 14 Oct 2014 15:05:09 +0300 Subject: [PATCH 1/3] Improved the advanced property pass to avoid a crash and generate more properties. Signed-off-by: Dimitar Dobrev --- src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs b/src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs index 899b86dd..bcfc44e9 100644 --- a/src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs +++ b/src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs @@ -271,17 +271,14 @@ namespace CppSharp.Passes public GetterSetterToPropertyAdvancedPass() { Options.VisitClassProperties = false; + Options.VisitFunctionParameters = false; } public override bool VisitClassDecl(Class @class) { - if (!AlreadyVisited(@class)) + if (base.VisitClassDecl(@class)) { - bool result = base.VisitClassDecl(@class); - new PropertyGenerator(@class, Log).GenerateProperties(); - - return result; } return false; } From 319b9691d207e934f0b33ba388a40146a65a6f71 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Tue, 14 Oct 2014 15:38:13 +0300 Subject: [PATCH 2/3] Marked the __Instance property in interfaces as synthetised. Signed-off-by: Dimitar Dobrev --- src/AST/Function.cs | 3 ++- src/AST/Property.cs | 5 +++++ src/Generator/Passes/MultipleInheritancePass.cs | 6 +++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/AST/Function.cs b/src/AST/Function.cs index f509a9ab..fc01d9b8 100644 --- a/src/AST/Function.cs +++ b/src/AST/Function.cs @@ -93,7 +93,8 @@ namespace CppSharp.AST None, ComplementOperator, AbstractImplCall, - DefaultValueOverload + DefaultValueOverload, + InterfaceInstance } public class Function : Declaration, ITypedDecl, IMangledDecl diff --git a/src/AST/Property.cs b/src/AST/Property.cs index a5524f3a..0b530cd2 100644 --- a/src/AST/Property.cs +++ b/src/AST/Property.cs @@ -115,6 +115,11 @@ namespace CppSharp.AST } } + public bool IsSynthetized + { + get { return GetMethod != null && GetMethod.IsSynthetized; } + } + public override T Visit(IDeclVisitor visitor) { return visitor.VisitProperty(this); diff --git a/src/Generator/Passes/MultipleInheritancePass.cs b/src/Generator/Passes/MultipleInheritancePass.cs index edfd4469..23bd1ee7 100644 --- a/src/Generator/Passes/MultipleInheritancePass.cs +++ b/src/Generator/Passes/MultipleInheritancePass.cs @@ -84,7 +84,11 @@ namespace CppSharp.Passes instance.Namespace = @interface; instance.Name = Helpers.InstanceIdentifier; instance.QualifiedType = new QualifiedType(new BuiltinType(PrimitiveType.IntPtr)); - instance.GetMethod = new Method { Namespace = @interface }; + instance.GetMethod = new Method + { + SynthKind = FunctionSynthKind.InterfaceInstance, + Namespace = @interface + }; @interface.Properties.Add(instance); } From 3c7c19ffc01962c6a3a27c7a0f52f73663a4db17 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Tue, 14 Oct 2014 15:58:26 +0300 Subject: [PATCH 3/3] Fixed the generation of anonymous types to consider parenting anonymous types. Signed-off-by: Dimitar Dobrev --- src/Generator/Passes/CleanInvalidDeclNamesPass.cs | 2 +- tests/Basic/Basic.h | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Generator/Passes/CleanInvalidDeclNamesPass.cs b/src/Generator/Passes/CleanInvalidDeclNamesPass.cs index 113b871f..70ecfc9b 100644 --- a/src/Generator/Passes/CleanInvalidDeclNamesPass.cs +++ b/src/Generator/Passes/CleanInvalidDeclNamesPass.cs @@ -35,7 +35,7 @@ namespace CppSharp.Passes // types with empty names are assumed to be private if (decl is Class && string.IsNullOrWhiteSpace(decl.Name)) { - decl.Name = "_"; + decl.Name = decl.Namespace.Name == "_" ? "__" : "_"; decl.ExplicitlyIgnore(); return false; } diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index a3c0bf42..7627f08e 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -561,3 +561,13 @@ public: }; DLL_API void va_listFunction(va_list v); + +struct DLL_API TestEmptyName +{ + struct + { + struct + { + }; + }; +};