Browse Source

Small cleanup and minor optimizations in ResolveIncompleteDeclsPass.

pull/969/head
Joao Matos 8 years ago
parent
commit
ecf4472152
  1. 40
      src/Generator/Passes/ResolveIncompleteDeclsPass.cs

40
src/Generator/Passes/ResolveIncompleteDeclsPass.cs

@ -1,11 +1,17 @@ @@ -1,11 +1,17 @@
using System.Linq;
using System.Collections.Generic;
using System.Linq;
using CppSharp.AST;
using System.Collections.Generic;
namespace CppSharp.Passes
{
public class ResolveIncompleteDeclsPass : TranslationUnitPass
{
public ResolveIncompleteDeclsPass()
{
VisitOptions.VisitFunctionParameters = false;
VisitOptions.VisitClassMethods = false;
}
public override bool VisitClassDecl(Class @class)
{
if (!base.VisitClassDecl(@class))
@ -25,7 +31,7 @@ namespace CppSharp.Passes @@ -25,7 +31,7 @@ namespace CppSharp.Passes
EnsureCompleteDeclaration(template.TemplatedDecl);
template.TemplatedDecl = template.TemplatedDecl.CompleteDeclaration ?? template.TemplatedDecl;
// store all spesializations in the real template class because ClassTemplateDecl only forwards
// store all specializations in the real template class because ClassTemplateDecl only forwards
foreach (var specialization in template.Specializations.Where(
s => !s.IsIncomplete && !template.TemplatedClass.Specializations.Contains(s)))
template.TemplatedClass.Specializations.Add(specialization);
@ -73,16 +79,9 @@ namespace CppSharp.Passes @@ -73,16 +79,9 @@ namespace CppSharp.Passes
return;
var @class = declaration as Class;
var redecls = @class?.Redeclarations;
if (@class != null && @class.IsOpaque)
{
if (redecls.Count == 0 ||
(redecls.Last() == @class && !redecls.Exists(decl => !decl.IsIncomplete)))
return;
duplicateClasses.Add(@class);
}
if (CheckForDuplicateForwardClass(@class))
return;
declaration.CompleteDeclaration =
ASTContext.FindCompleteClass(declaration.QualifiedName);
@ -94,6 +93,21 @@ namespace CppSharp.Passes @@ -94,6 +93,21 @@ namespace CppSharp.Passes
}
}
bool CheckForDuplicateForwardClass(Class @class)
{
var redecls = @class?.Redeclarations;
if (@class != null && @class.IsOpaque)
{
if (redecls.Count == 0 ||
(redecls.Last() == @class && !redecls.Exists(decl => !decl.IsIncomplete)))
return true;
duplicateClasses.Add(@class);
}
return false;
}
public override bool VisitASTContext(ASTContext c)
{
base.VisitASTContext(c);

Loading…
Cancel
Save