Browse Source

Call __cxxi_InitBases in derived types

pull/1/head
Alexander Corrado 14 years ago
parent
commit
b9b2232c95
  1. 2
      src/generator/Generator.cs
  2. 326
      src/generator/Templates/CSharp/CSharpClass.cs
  3. 9
      src/generator/Templates/CSharp/CSharpClass.tt

2
src/generator/Generator.cs

@ -381,7 +381,7 @@ public class Generator { @@ -381,7 +381,7 @@ public class Generator {
}
// Checks klass's primary base, primary base's primary base, and so on up the hierarchy
bool CheckPrimaryBases (Class klass, Func<Class, bool> predicate)
public bool CheckPrimaryBases (Class klass, Func<Class, bool> predicate)
{
if (klass.BaseClasses.Count == 0)
return false;

326
src/generator/Templates/CSharp/CSharpClass.cs

File diff suppressed because it is too large Load Diff

9
src/generator/Templates/CSharp/CSharpClass.tt

@ -9,7 +9,8 @@ @@ -9,7 +9,8 @@
var iface = "I" + Class.Name;
var layout = "_" + Class.Name;
var layoutClass = (hasBase? "\t: base (impl.TypeInfo)\n\t\t{" : "{") + "\n\t\t\t__cxxi_LayoutClass ();";
var initBases = (Class.BaseClasses.Count > 1 ? "\t__cxxi_InitBases ();\n\t\t}" : "}");
var overrideInitBases = Generator.CheckPrimaryBases (Class, c => c.BaseClasses.Count > 1);
var initBases = ((overrideInitBases || Class.BaseClasses.Count > 1) ? "\t__cxxi_InitBases ();\n\t\t}" : "}");
#>
// -------------------------------------------------------------------------
// Managed wrapper for <#= Class.Name #>
@ -266,9 +267,11 @@ foreach (var npBase in Class.BaseClasses.Skip (1)) { #> @@ -266,9 +267,11 @@ foreach (var npBase in Class.BaseClasses.Skip (1)) { #>
ClearIndent ();
WriteLine ("#endregion");
}
if (Class.BaseClasses.Count > 1) { #>
private void __cxxi_InitBases ()
if (overrideInitBases || Class.BaseClasses.Count > 1) { #>
protected <#= overrideInitBases ? "override" : "virtual" #> void __cxxi_InitBases ()
{
<#= overrideInitBases? "base.__cxxi_InitBases ();" : "" #>
<# foreach (var npBase in Class.BaseClasses.Skip (1)) { #>
__cxxi_<#= npBase.Name #> = new <#= wrapper + "__" + npBase.Name #> (this);
<# } #>

Loading…
Cancel
Save