diff --git a/src/generator/Class.cs b/src/generator/Class.cs index 25409498..b675b107 100644 --- a/src/generator/Class.cs +++ b/src/generator/Class.cs @@ -119,26 +119,37 @@ class Class decl.Members.Add (ptrField); } + var implTypeInfo = new CodeFieldReferenceExpression (new CodeFieldReferenceExpression { FieldName = "impl" }, "TypeInfo"); + CodeStatement [] initNonPrimaryBases = null; + if (BaseClasses.Count > 1) { + initNonPrimaryBases = new CodeStatement [BaseClasses.Count - 1]; + for (var i = 1; i <= initNonPrimaryBases.Length; i++) { + initNonPrimaryBases [i - 1] = new CodeExpressionStatement (new CodeObjectCreateExpression (BaseClasses [i].Name, implTypeInfo)); + } + } + var nativeCtor = new CodeConstructor () { Attributes = MemberAttributes.Public }; - nativeCtor.Parameters.Add (new CodeParameterDeclarationExpression (new CodeTypeReference ("CppInstancePtr"), "native")); - nativeCtor.Statements.Add (new CodeAssignStatement (new CodeFieldReferenceExpression (null, "native_ptr"), new CodeArgumentReferenceExpression ("native"))); if (hasBase) { - var implTypeInfo = new CodeFieldReferenceExpression (new CodeFieldReferenceExpression { FieldName = "impl" }, "TypeInfo"); nativeCtor.BaseConstructorArgs.Add (implTypeInfo); + if (initNonPrimaryBases != null) + nativeCtor.Statements.AddRange (initNonPrimaryBases); } + nativeCtor.Parameters.Add (new CodeParameterDeclarationExpression (new CodeTypeReference ("CppInstancePtr"), "native")); + nativeCtor.Statements.Add (new CodeAssignStatement (new CodeFieldReferenceExpression (null, "native_ptr"), new CodeArgumentReferenceExpression ("native"))); decl.Members.Add (nativeCtor); var subclassCtor = new CodeConstructor () { Attributes = MemberAttributes.Public }; - subclassCtor.Parameters.Add (new CodeParameterDeclarationExpression (new CodeTypeReference ("CppTypeInfo"), "subClass")); - subclassCtor.Statements.Add (new CodeExpressionStatement (new CodeMethodInvokeExpression (new CodeMethodReferenceExpression (new CodeArgumentReferenceExpression ("subClass"), "AddBase"), new CodeExpression [] { new CodeFieldReferenceExpression (new CodeFieldReferenceExpression (null, "impl"), "TypeInfo") }))); if (hasBase) { - var implTypeInfo = new CodeFieldReferenceExpression (new CodeFieldReferenceExpression { FieldName = "impl" }, "TypeInfo"); subclassCtor.BaseConstructorArgs.Add (implTypeInfo); + if (initNonPrimaryBases != null) + subclassCtor.Statements.AddRange (initNonPrimaryBases); } + subclassCtor.Parameters.Add (new CodeParameterDeclarationExpression (new CodeTypeReference ("CppTypeInfo"), "subClass")); + subclassCtor.Statements.Add (new CodeExpressionStatement (new CodeMethodInvokeExpression (new CodeMethodReferenceExpression (new CodeArgumentReferenceExpression ("subClass"), "AddBase"), new CodeExpression [] { new CodeFieldReferenceExpression (new CodeFieldReferenceExpression (null, "impl"), "TypeInfo") }))); decl.Members.Add (subclassCtor); if (!hasBase) { @@ -155,6 +166,8 @@ class Class Name = "Dispose", Attributes = MemberAttributes.Public }; + if (hasBase) + disposeMethod.Attributes |= MemberAttributes.Override; if (Methods.Any (m => m.IsDestructor)) disposeMethod.Statements.Add (new CodeExpressionStatement (new CodeMethodInvokeExpression (new CodeMethodReferenceExpression (new CodeFieldReferenceExpression (null, "impl"), "Destruct"), new CodeExpression [] { new CodeFieldReferenceExpression (null, "Native") }))); disposeMethod.Statements.Add (new CodeExpressionStatement (new CodeMethodInvokeExpression (new CodeMethodReferenceExpression (new CodeFieldReferenceExpression (null, "Native"), "Dispose")))); @@ -166,8 +179,11 @@ class Class if (m.GenWrapperMethod) { var cm = m.GenerateWrapperMethod (g); if (m.IsConstructor && hasBase) { - var implTypeInfo = new CodeFieldReferenceExpression (new CodeFieldReferenceExpression { FieldName = "impl" }, "TypeInfo"); (cm as CodeConstructor).BaseConstructorArgs.Add (implTypeInfo); + if (initNonPrimaryBases != null) { + foreach (var init in initNonPrimaryBases.Reverse ()) + cm.Statements.Insert (0, init); + } } decl.Members.Add (cm); } diff --git a/src/generator/generator.csproj b/src/generator/generator.csproj index 716bafe1..be4c5db9 100644 --- a/src/generator/generator.csproj +++ b/src/generator/generator.csproj @@ -35,17 +35,16 @@ true full false - bin\Debug + ..\..\bin\Debug DEBUG prompt 4 - -f=QObject.xml -o=output AllRules.ruleset none false - bin\Release + ..\..\bin\Release prompt 4 AllRules.ruleset @@ -68,7 +67,7 @@ - + False ..\..\bin\Debug\Mono.VisualC.Interop.dll