Browse Source

Reworked how we collect type references to deal better with non-unit classes.

pull/1/head
triton 13 years ago
parent
commit
961ac10ded
  1. 65
      src/Generator/Types/Types.cs

65
src/Generator/Types/Types.cs

@ -141,7 +141,7 @@ namespace Cxxi
{ {
public ISet<Declaration> ForwardReferences; public ISet<Declaration> ForwardReferences;
public ISet<Class> Bases; public ISet<Class> Bases;
private Class mainClass; private TranslationUnit unit;
public TypeRefsVisitor() public TypeRefsVisitor()
{ {
@ -160,24 +160,29 @@ namespace Cxxi
ForwardReferences.Add(declaration); ForwardReferences.Add(declaration);
} }
public void Process(Declaration declaration) public bool VisitTranslationUnit(TranslationUnit unit)
{ {
if (declaration is Class) this.unit = unit;
{ unit.TypeReferences = this;
mainClass = declaration as Class;
Visited.Remove(mainClass); VisitNamespace(unit);
}
foreach (var @namespace in unit.Namespaces)
VisitNamespace(@namespace);
declaration.Visit(this); return true;
} }
public override bool VisitClassDecl(Class @class) public override bool VisitClassDecl(Class @class)
{ {
if (AlreadyVisited(@class))
return true;
if (@class.Ignore) if (@class.Ignore)
return true; {
Visited.Add(@class);
return false;
}
if (Visited.Contains(@class))
return ForwardReferences.Contains(@class);
Collect(@class); Collect(@class);
@ -185,16 +190,11 @@ namespace Cxxi
// members, else it will add references to declarations that // members, else it will add references to declarations that
// should have not been found. // should have not been found.
if (@class.IsIncomplete) if (@class.IsIncomplete)
return true; goto OutVisited;
if (@class != mainClass) var unitClass = unit.FindClass(@class.Name);
return true; if (unitClass == null || unitClass.IsIncomplete)
goto OutVisited;
foreach (var field in @class.Fields)
VisitFieldDecl(field);
foreach (var method in @class.Methods)
VisitMethodDecl(method);
foreach (var @base in @class.Bases) foreach (var @base in @class.Bases)
{ {
@ -204,6 +204,11 @@ namespace Cxxi
Bases.Add(@base.Class); Bases.Add(@base.Class);
} }
return base.VisitClassDecl(@class);
OutVisited:
Visited.Add(@class);
return true; return true;
} }
@ -215,21 +220,8 @@ namespace Cxxi
public override bool VisitFieldDecl(Field field) public override bool VisitFieldDecl(Field field)
{ {
Class @class; if (base.VisitFieldDecl(field))
Enumeration @enum; Collect(field);
if (field.Type.IsTagDecl(out @class))
{
Collect(@field);
}
else if (field.Type.IsTagDecl(out @enum))
{
Collect(@field);
}
else
{
field.Type.Visit(this);
}
return true; return true;
} }
@ -246,6 +238,7 @@ namespace Cxxi
if (decl.Type.IsPointerTo<FunctionType>(out function)) if (decl.Type.IsPointerTo<FunctionType>(out function))
{ {
Collect(decl); Collect(decl);
return true;
} }
return decl.Type.Visit(this); return decl.Type.Visit(this);

Loading…
Cancel
Save