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

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

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

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

@ -45,9 +45,9 @@ namespace Cxxi.Generators.CLI @@ -45,9 +45,9 @@ namespace Cxxi.Generators.CLI
var typeRefs = TranslationUnit.TypeReferences as TypeRefsVisitor;
// 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)
decl = decl.CompleteDeclaration;

26
src/Generator/Types/Types.cs

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

Loading…
Cancel
Save