Tools and libraries to glue C/C++ APIs to high-level languages
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

70 lines
2.6 KiB

using System.Collections.Generic;
using System.Linq;
using CppSharp.AST;
using CppSharp.AST.Extensions;
namespace CppSharp.Passes
{
public class MarkUsedClassInternalsPass : TranslationUnitPass
{
public MarkUsedClassInternalsPass()
{
VisitOptions.VisitClassBases = false;
VisitOptions.VisitClassFields = false;
VisitOptions.VisitClassMethods = false;
VisitOptions.VisitClassProperties = false;
VisitOptions.VisitEventParameters = false;
VisitOptions.VisitFunctionReturnType = false;
VisitOptions.VisitFunctionParameters = false;
VisitOptions.VisitNamespaceEnums = false;
VisitOptions.VisitNamespaceEvents = false;
VisitOptions.VisitNamespaceTemplates = false;
VisitOptions.VisitNamespaceVariables = false;
VisitOptions.VisitTemplateArguments = false;
}
public override bool VisitClassDecl(Class @class)
{
if (!base.VisitClassDecl(@class) || @class.Ignore || @class.IsDependent)
return false;
MarkUsedFieldTypes(@class, new HashSet<DeclarationContext>());
return true;
}
private static void MarkUsedFieldTypes(DeclarationContext declContext,
HashSet<DeclarationContext> visitedDeclarationContexts)
{
if (visitedDeclarationContexts.Contains(declContext))
return;
visitedDeclarationContexts.Add(declContext);
DeclarationContext decl = null;
var @class = declContext as Class;
if (@class == null)
return;
foreach (var field in @class.Layout.Fields.Where(
f => f.QualifiedType.Type.TryGetDeclaration(out decl)))
{
DeclarationContext declarationContext = decl;
do
{
if (declarationContext.Ignore)
{
declarationContext.GenerationKind = GenerationKind.Internal;
var specialization = declarationContext as ClassTemplateSpecialization;
if (specialization?.TemplatedDecl.TemplatedClass.Ignore == true)
specialization.TemplatedDecl.TemplatedClass.GenerationKind = GenerationKind.Internal;
}
declarationContext = declarationContext.Namespace;
} while (declarationContext != null);
MarkUsedFieldTypes(decl, visitedDeclarationContexts);
}
}
}
}