Browse Source

Small cleanup and minor optimizations in ResolveIncompleteDeclsPass.

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

38
src/Generator/Passes/ResolveIncompleteDeclsPass.cs

@ -1,11 +1,17 @@
using System.Linq; using System.Collections.Generic;
using System.Linq;
using CppSharp.AST; using CppSharp.AST;
using System.Collections.Generic;
namespace CppSharp.Passes namespace CppSharp.Passes
{ {
public class ResolveIncompleteDeclsPass : TranslationUnitPass public class ResolveIncompleteDeclsPass : TranslationUnitPass
{ {
public ResolveIncompleteDeclsPass()
{
VisitOptions.VisitFunctionParameters = false;
VisitOptions.VisitClassMethods = false;
}
public override bool VisitClassDecl(Class @class) public override bool VisitClassDecl(Class @class)
{ {
if (!base.VisitClassDecl(@class)) if (!base.VisitClassDecl(@class))
@ -25,7 +31,7 @@ namespace CppSharp.Passes
EnsureCompleteDeclaration(template.TemplatedDecl); EnsureCompleteDeclaration(template.TemplatedDecl);
template.TemplatedDecl = template.TemplatedDecl.CompleteDeclaration ?? 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( foreach (var specialization in template.Specializations.Where(
s => !s.IsIncomplete && !template.TemplatedClass.Specializations.Contains(s))) s => !s.IsIncomplete && !template.TemplatedClass.Specializations.Contains(s)))
template.TemplatedClass.Specializations.Add(specialization); template.TemplatedClass.Specializations.Add(specialization);
@ -73,15 +79,8 @@ namespace CppSharp.Passes
return; return;
var @class = declaration as Class; var @class = declaration as Class;
var redecls = @class?.Redeclarations; if (CheckForDuplicateForwardClass(@class))
if (@class != null && @class.IsOpaque) return;
{
if (redecls.Count == 0 ||
(redecls.Last() == @class && !redecls.Exists(decl => !decl.IsIncomplete)))
return;
duplicateClasses.Add(@class);
}
declaration.CompleteDeclaration = declaration.CompleteDeclaration =
ASTContext.FindCompleteClass(declaration.QualifiedName); ASTContext.FindCompleteClass(declaration.QualifiedName);
@ -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) public override bool VisitASTContext(ASTContext c)
{ {
base.VisitASTContext(c); base.VisitASTContext(c);

Loading…
Cancel
Save