Browse Source

We now keep track of the namespaces where type references where found so we can generate forward references only in the containing namespaces.

pull/1/head
triton 13 years ago
parent
commit
be63deeb97
  1. 13
      src/Generator/Generators/CLI/CLIForwardReferencePrinter.cs
  2. 2
      src/Generator/Generators/CLI/CLIHeadersTemplate.cs
  3. 4
      src/Generator/Generators/CLI/CLISourcesTemplate.cs
  4. 26
      src/Generator/Types/Types.cs

13
src/Generator/Generators/CLI/CLIForwardReferencePrinter.cs

@ -7,6 +7,7 @@ namespace Cxxi.Generators.CLI
public struct CLIForwardReference public struct CLIForwardReference
{ {
public Declaration Declaration; public Declaration Declaration;
public Namespace Namespace;
public string Text; public string Text;
} }
@ -15,6 +16,7 @@ namespace Cxxi.Generators.CLI
public readonly IList<string> Includes; public readonly IList<string> Includes;
public readonly IList<CLIForwardReference> Refs; public readonly IList<CLIForwardReference> Refs;
private readonly TypeRefsVisitor TypeRefs; private readonly TypeRefsVisitor TypeRefs;
private TypeReference currentTypeReference;
public CLIForwardReferencePrinter(TypeRefsVisitor typeRefs) public CLIForwardReferencePrinter(TypeRefsVisitor typeRefs)
{ {
@ -25,8 +27,11 @@ namespace Cxxi.Generators.CLI
public void Process() public void Process()
{ {
foreach (var forwardRef in TypeRefs.ForwardReferences) foreach (var typeRef in TypeRefs.References)
forwardRef.Visit(this); {
currentTypeReference = typeRef;
typeRef.Declaration.Visit(this);
}
foreach (var baseClass in TypeRefs.Bases) foreach (var baseClass in TypeRefs.Bases)
VisitBaseClass(baseClass); VisitBaseClass(baseClass);
@ -59,6 +64,7 @@ namespace Cxxi.Generators.CLI
Refs.Add(new CLIForwardReference() Refs.Add(new CLIForwardReference()
{ {
Declaration = @class, Declaration = @class,
Namespace = currentTypeReference.Namespace,
Text = string.Format("value struct {0};", @class.Name) Text = string.Format("value struct {0};", @class.Name)
}); });
@ -68,6 +74,7 @@ namespace Cxxi.Generators.CLI
Refs.Add(new CLIForwardReference() Refs.Add(new CLIForwardReference()
{ {
Declaration = @class, Declaration = @class,
Namespace = currentTypeReference.Namespace,
Text = string.Format("ref class {0};", @class.Name) Text = string.Format("ref class {0};", @class.Name)
}); });
@ -145,6 +152,7 @@ namespace Cxxi.Generators.CLI
Refs.Add(new CLIForwardReference() Refs.Add(new CLIForwardReference()
{ {
Declaration = @enum, Declaration = @enum,
Namespace = currentTypeReference.Namespace,
Text = string.Format("enum struct {0};", @enum.Name) Text = string.Format("enum struct {0};", @enum.Name)
}); });
@ -154,6 +162,7 @@ namespace Cxxi.Generators.CLI
Refs.Add(new CLIForwardReference() Refs.Add(new CLIForwardReference()
{ {
Declaration = @enum, Declaration = @enum,
Namespace = currentTypeReference.Namespace,
Text = string.Format("enum struct {0} : {1};", @enum.Name, @enum.Type) Text = string.Format("enum struct {0} : {1};", @enum.Name, @enum.Type)
}); });
return true; return true;

2
src/Generator/Generators/CLI/CLIHeadersTemplate.cs

@ -70,7 +70,7 @@ namespace Cxxi.Generators.CLI
foreach (var forwardRef in forwardRefsPrinter.Refs) foreach (var forwardRef in forwardRefsPrinter.Refs)
{ {
if (forwardRef.Declaration.Namespace != @namespace) if (forwardRef.Namespace != @namespace)
continue; continue;
forwardRefs.Add(forwardRef.Text); forwardRefs.Add(forwardRef.Text);

4
src/Generator/Generators/CLI/CLISourcesTemplate.cs

@ -45,9 +45,9 @@ namespace Cxxi.Generators.CLI
var typeRefs = TranslationUnit.TypeReferences as TypeRefsVisitor; var typeRefs = TranslationUnit.TypeReferences as TypeRefsVisitor;
// Generate the forward references. // Generate the forward references.
foreach (var forwardRef in typeRefs.ForwardReferences) foreach (var forwardRef in typeRefs.References)
{ {
var decl = forwardRef; var decl = forwardRef.Declaration;
if (decl.IsIncomplete && decl.CompleteDeclaration != null) if (decl.IsIncomplete && decl.CompleteDeclaration != null)
decl = decl.CompleteDeclaration; decl = decl.CompleteDeclaration;

26
src/Generator/Types/Types.cs

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using Cxxi.Types; using Cxxi.Types;
namespace Cxxi namespace Cxxi
@ -130,6 +131,12 @@ namespace Cxxi
} }
} }
public struct TypeReference
{
public Declaration Declaration;
public Namespace Namespace;
}
/// <summary> /// <summary>
/// This is used to get the declarations that each file needs to forward /// This is used to get the declarations that each file needs to forward
/// reference or include from other header files. Since in C++ everything /// reference or include from other header files. Since in C++ everything
@ -139,13 +146,14 @@ namespace Cxxi
/// </summary> /// </summary>
public class TypeRefsVisitor : AstVisitor public class TypeRefsVisitor : AstVisitor
{ {
public ISet<Declaration> ForwardReferences; public ISet<TypeReference> References;
public ISet<Class> Bases; public ISet<Class> Bases;
private TranslationUnit unit; private TranslationUnit unit;
private Namespace currentNamespace;
public TypeRefsVisitor() public TypeRefsVisitor()
{ {
ForwardReferences = new HashSet<Declaration>(); References = new HashSet<TypeReference>();
Bases = new HashSet<Class>(); Bases = new HashSet<Class>();
} }
@ -157,7 +165,11 @@ namespace Cxxi
if (@namespace.TranslationUnit.IsSystemHeader) if (@namespace.TranslationUnit.IsSystemHeader)
return; return;
ForwardReferences.Add(declaration); References.Add(new TypeReference()
{
Declaration = declaration,
Namespace = currentNamespace
});
} }
public bool VisitTranslationUnit(TranslationUnit unit) public bool VisitTranslationUnit(TranslationUnit unit)
@ -173,6 +185,12 @@ namespace Cxxi
return true; return true;
} }
public override bool VisitNamespace(Namespace @namespace)
{
currentNamespace = @namespace;
return base.VisitNamespace(@namespace);
}
public override bool VisitClassDecl(Class @class) public override bool VisitClassDecl(Class @class)
{ {
if (@class.Ignore) if (@class.Ignore)
@ -182,7 +200,7 @@ namespace Cxxi
} }
if (Visited.Contains(@class)) if (Visited.Contains(@class))
return ForwardReferences.Contains(@class); return References.Any(reference => reference.Declaration == @class);
Collect(@class); Collect(@class);

Loading…
Cancel
Save