|
|
|
@ -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); |
|
|
|
|