Browse Source

Generator: call subclass constructor on non-primary base classes

pull/1/head
Alex Corrado 14 years ago
parent
commit
984639042f
  1. 30
      src/generator/Class.cs
  2. 7
      src/generator/generator.csproj

30
src/generator/Class.cs

@ -119,26 +119,37 @@ class Class
decl.Members.Add (ptrField); 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 () { var nativeCtor = new CodeConstructor () {
Attributes = MemberAttributes.Public 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) { if (hasBase) {
var implTypeInfo = new CodeFieldReferenceExpression (new CodeFieldReferenceExpression { FieldName = "impl" }, "TypeInfo");
nativeCtor.BaseConstructorArgs.Add (implTypeInfo); 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); decl.Members.Add (nativeCtor);
var subclassCtor = new CodeConstructor () { var subclassCtor = new CodeConstructor () {
Attributes = MemberAttributes.Public 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) { if (hasBase) {
var implTypeInfo = new CodeFieldReferenceExpression (new CodeFieldReferenceExpression { FieldName = "impl" }, "TypeInfo");
subclassCtor.BaseConstructorArgs.Add (implTypeInfo); 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); decl.Members.Add (subclassCtor);
if (!hasBase) { if (!hasBase) {
@ -155,6 +166,8 @@ class Class
Name = "Dispose", Name = "Dispose",
Attributes = MemberAttributes.Public Attributes = MemberAttributes.Public
}; };
if (hasBase)
disposeMethod.Attributes |= MemberAttributes.Override;
if (Methods.Any (m => m.IsDestructor)) 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, "impl"), "Destruct"), new CodeExpression [] { new CodeFieldReferenceExpression (null, "Native") })));
disposeMethod.Statements.Add (new CodeExpressionStatement (new CodeMethodInvokeExpression (new CodeMethodReferenceExpression (new CodeFieldReferenceExpression (null, "Native"), "Dispose")))); disposeMethod.Statements.Add (new CodeExpressionStatement (new CodeMethodInvokeExpression (new CodeMethodReferenceExpression (new CodeFieldReferenceExpression (null, "Native"), "Dispose"))));
@ -166,8 +179,11 @@ class Class
if (m.GenWrapperMethod) { if (m.GenWrapperMethod) {
var cm = m.GenerateWrapperMethod (g); var cm = m.GenerateWrapperMethod (g);
if (m.IsConstructor && hasBase) { if (m.IsConstructor && hasBase) {
var implTypeInfo = new CodeFieldReferenceExpression (new CodeFieldReferenceExpression { FieldName = "impl" }, "TypeInfo");
(cm as CodeConstructor).BaseConstructorArgs.Add (implTypeInfo); (cm as CodeConstructor).BaseConstructorArgs.Add (implTypeInfo);
if (initNonPrimaryBases != null) {
foreach (var init in initNonPrimaryBases.Reverse ())
cm.Statements.Insert (0, init);
}
} }
decl.Members.Add (cm); decl.Members.Add (cm);
} }

7
src/generator/generator.csproj

@ -35,17 +35,16 @@
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>bin\Debug</OutputPath> <OutputPath>..\..\bin\Debug</OutputPath>
<DefineConstants>DEBUG</DefineConstants> <DefineConstants>DEBUG</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<Commandlineparameters>-f=QObject.xml -o=output</Commandlineparameters>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>none</DebugType> <DebugType>none</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>bin\Release</OutputPath> <OutputPath>..\..\bin\Release</OutputPath>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
@ -68,7 +67,7 @@
<Reference Include="System.Xml.Linq"> <Reference Include="System.Xml.Linq">
</Reference> </Reference>
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="Mono.VisualC.Interop, Version=1.0.4164.32966, Culture=neutral, PublicKeyToken=null"> <Reference Include="Mono.VisualC.Interop, Version=1.0.4175.35169, Culture=neutral, PublicKeyToken=null">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\bin\Debug\Mono.VisualC.Interop.dll</HintPath> <HintPath>..\..\bin\Debug\Mono.VisualC.Interop.dll</HintPath>
</Reference> </Reference>

Loading…
Cancel
Save