From d94c930b3600ddb4de5cff52d79fa8cd7fb6d99e Mon Sep 17 00:00:00 2001 From: triton Date: Thu, 14 Mar 2013 12:04:18 +0000 Subject: [PATCH] Rework forward references to keep track of what declaration they came from. This allows proper processing per namespace. --- .../CLI/CLIForwardReferencePrinter.cs | 38 +++++++++++++++---- .../Generators/CLI/CLIHeadersTemplate.cs | 14 +++++-- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/Generator/Generators/CLI/CLIForwardReferencePrinter.cs b/src/Generator/Generators/CLI/CLIForwardReferencePrinter.cs index ccc084db..a22128fa 100644 --- a/src/Generator/Generators/CLI/CLIForwardReferencePrinter.cs +++ b/src/Generator/Generators/CLI/CLIForwardReferencePrinter.cs @@ -4,16 +4,22 @@ using System.IO; namespace Cxxi.Generators.CLI { + public struct CLIForwardReference + { + public Declaration Declaration; + public string Text; + } + public class CLIForwardReferencePrinter : IDeclVisitor { public readonly IList Includes; - public readonly IList Refs; + public readonly IList Refs; private readonly TypeRefsVisitor TypeRefs; public CLIForwardReferencePrinter(TypeRefsVisitor typeRefs) { Includes = new List(); - Refs = new List(); + Refs = new List(); TypeRefs = typeRefs; } @@ -50,11 +56,21 @@ namespace Cxxi.Generators.CLI if (@class.IsValueType) { - Refs.Add(string.Format("value struct {0};", @class.Name)); + Refs.Add(new CLIForwardReference() + { + Declaration = @class, + Text = string.Format("value struct {0};", @class.Name) + }); + return true; } - Refs.Add(string.Format("ref class {0};", @class.Name)); + Refs.Add(new CLIForwardReference() + { + Declaration = @class, + Text = string.Format("ref class {0};", @class.Name) + }); + return true; } @@ -126,12 +142,20 @@ namespace Cxxi.Generators.CLI if (@enum.Type.IsPrimitiveType(PrimitiveType.Int32)) { - Refs.Add(string.Format("enum struct {0};", @enum.Name)); + Refs.Add(new CLIForwardReference() + { + Declaration = @enum, + Text = string.Format("enum struct {0};", @enum.Name) + }); + return true; } - Refs.Add(string.Format("enum struct {0} : {1};", @enum.Name, - @enum.Type)); + Refs.Add(new CLIForwardReference() + { + Declaration = @enum, + Text = string.Format("enum struct {0} : {1};", @enum.Name, @enum.Type) + }); return true; } diff --git a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs index 7484c5ed..032a0bb4 100644 --- a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs +++ b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs @@ -10,8 +10,6 @@ namespace Cxxi.Generators.CLI { public override string FileExtension { get { return "h"; } } - private CLIForwardReferencePrinter forwardRefsPrinter; - public CLIHeadersTemplate(Driver driver, TranslationUnit unit) : base(driver, unit) { @@ -40,7 +38,7 @@ namespace Cxxi.Generators.CLI { var typeRefs = TranslationUnit.TypeReferences as TypeRefsVisitor; - forwardRefsPrinter = new CLIForwardReferencePrinter(typeRefs); + var forwardRefsPrinter = new CLIForwardReferencePrinter(typeRefs); forwardRefsPrinter.Process(); var includes = new SortedSet(StringComparer.InvariantCulture); @@ -65,12 +63,20 @@ namespace Cxxi.Generators.CLI public void GenerateForwardRefs() { + var typeRefs = TranslationUnit.TypeReferences as TypeRefsVisitor; + + var forwardRefsPrinter = new CLIForwardReferencePrinter(typeRefs); + forwardRefsPrinter.Process(); + // Use a set to remove duplicate entries. var forwardRefs = new HashSet(); foreach (var forwardRef in forwardRefsPrinter.Refs) { - forwardRefs.Add(forwardRef); + if (forwardRef.Declaration.Namespace != @namespace) + continue; + + forwardRefs.Add(forwardRef.Text); } foreach (var forwardRef in forwardRefs)