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