From 8d7dc79ead83c01e5d126724d714cee223b0fced Mon Sep 17 00:00:00 2001 From: triton Date: Tue, 26 Feb 2013 00:59:48 +0000 Subject: [PATCH] Process base class references as forward references. --- .../CLI/CLIForwardRefeferencePrinter.cs | 24 ++++++++++++++++++- .../Generators/CLI/CLIHeadersTemplate.cs | 7 +++--- src/Generator/Types/Types.cs | 13 +++++++++- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/Generator/Generators/CLI/CLIForwardRefeferencePrinter.cs b/src/Generator/Generators/CLI/CLIForwardRefeferencePrinter.cs index cb0ea7fb..64ed68af 100644 --- a/src/Generator/Generators/CLI/CLIForwardRefeferencePrinter.cs +++ b/src/Generator/Generators/CLI/CLIForwardRefeferencePrinter.cs @@ -8,11 +8,33 @@ namespace Cxxi.Generators.CLI { public readonly IList Includes; public readonly IList Refs; + private readonly TypeRefsVisitor TypeRefs; - public CLIForwardRefeferencePrinter() + public CLIForwardRefeferencePrinter(TypeRefsVisitor typeRefs) { Includes = new List(); Refs = new List(); + TypeRefs = typeRefs; + } + + public void Process() + { + foreach (var forwardRef in TypeRefs.ForwardReferences) + forwardRef.Visit(this); + + foreach (var baseClass in TypeRefs.Bases) + VisitBaseClass(baseClass); + } + + public void VisitBaseClass(Class @class) + { + if (@class.IsIncomplete) + @class = @class.CompleteDeclaration as Class; + + if (@class == null) + return; + + Includes.Add(GetHeaderFromDecl(@class)); } public bool VisitDeclaration(Declaration decl) diff --git a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs index 0383ebd8..dc7d5847 100644 --- a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs +++ b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; namespace Cxxi.Generators.CLI @@ -36,10 +37,10 @@ namespace Cxxi.Generators.CLI public void GenerateIncludeForwardRefs() { - forwardRefsPrinter = new CLIForwardRefeferencePrinter(); + var typeRefs = unit.TypeReferences as TypeRefsVisitor; - foreach (var forwardRef in unit.ForwardReferences) - forwardRef.Visit(forwardRefsPrinter); + forwardRefsPrinter = new CLIForwardRefeferencePrinter(typeRefs); + forwardRefsPrinter.Process(); var includes = new HashSet(); diff --git a/src/Generator/Types/Types.cs b/src/Generator/Types/Types.cs index 111d126c..7151da2b 100644 --- a/src/Generator/Types/Types.cs +++ b/src/Generator/Types/Types.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Diagnostics; using Cxxi.Generators; using Cxxi.Types; @@ -136,9 +137,10 @@ namespace Cxxi /// that a file needs to be reference something that has not been declared /// yet. In that case, we need to declare it before referencing it. /// - class TypeRefsVisitor : AstVisitor + public class TypeRefsVisitor : AstVisitor { public ISet ForwardReferences; + public ISet Bases; public void Collect(Declaration declaration) { @@ -154,6 +156,7 @@ namespace Cxxi public TypeRefsVisitor() { ForwardReferences = new HashSet(); + Bases = new HashSet(); } public override bool VisitClassDecl(Class @class) @@ -175,6 +178,14 @@ namespace Cxxi foreach (var method in @class.Methods) VisitMethodDecl(method); + foreach (var @base in @class.Bases) + { + if (!@base.IsClass) + continue; + + Bases.Add(@base.Class); + } + return true; }