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.
 
 
 
 
 

124 lines
4.1 KiB

using System.Linq;
using CppSharp.AST;
using CppSharp.AST.Extensions;
namespace CppSharp.Passes
{
public class IgnoreSystemDeclarationsPass : TranslationUnitPass
{
public IgnoreSystemDeclarationsPass()
=> VisitOptions.ResetFlags(VisitFlags.NamespaceEnums);
public override bool VisitTranslationUnit(TranslationUnit unit)
{
if (!unit.IsValid)
return false;
if (ClearVisitedDeclarations)
Visited.Clear();
VisitDeclarationContext(unit);
return true;
}
public override bool VisitClassDecl(Class @class)
{
if (!base.VisitClassDecl(@class) || Options.IsCLIGenerator)
return false;
if (!@class.TranslationUnit.IsSystemHeader)
return false;
@class.ExplicitlyIgnore();
if (!@class.IsDependent || @class.Specializations.Count == 0)
return false;
foreach (var specialization in @class.Specializations.Where(s => s.IsGenerated))
specialization.ExplicitlyIgnore();
// we only need a few members for marshalling so strip the rest
switch (@class.Name)
{
case "basic_string":
case "allocator":
case "char_traits":
@class.GenerationKind = GenerationKind.Generate;
foreach (var specialization in from s in @class.Specializations
where !s.Arguments.Any(a =>
s.UnsupportedTemplateArgument(a, Context.TypeMaps))
let arg = s.Arguments[0].Type.Type.Desugar()
where arg.IsPrimitiveType(PrimitiveType.Char)
select s)
{
specialization.GenerationKind = GenerationKind.Generate;
InternalizeSpecializationsInFields(specialization);
}
break;
}
return true;
}
public override bool VisitEnumDecl(Enumeration @enum)
{
if (!base.VisitEnumDecl(@enum))
return false;
if (@enum.TranslationUnit.IsSystemHeader)
@enum.ExplicitlyIgnore();
return true;
}
public override bool VisitFunctionDecl(Function function)
{
if (!base.VisitFunctionDecl(function))
return false;
if (function.TranslationUnit.IsSystemHeader)
function.ExplicitlyIgnore();
return true;
}
public override bool VisitTypedefDecl(TypedefDecl typedef)
{
if (!base.VisitTypedefDecl(typedef))
return false;
if (typedef.TranslationUnit.IsSystemHeader)
typedef.ExplicitlyIgnore();
return true;
}
public override bool VisitVariableDecl(Variable variable)
{
if (!base.VisitDeclaration(variable))
return false;
if (variable.TranslationUnit.IsSystemHeader)
variable.ExplicitlyIgnore();
return true;
}
private void InternalizeSpecializationsInFields(ClassTemplateSpecialization specialization)
{
foreach (Field field in specialization.Fields)
{
ASTUtils.CheckTypeForSpecialization(field.Type, specialization,
specialization =>
{
if (!specialization.IsExplicitlyGenerated &&
specialization.GenerationKind != GenerationKind.Internal)
{
specialization.GenerationKind = GenerationKind.Internal;
InternalizeSpecializationsInFields(specialization);
}
}, Context.TypeMaps, true);
}
}
}
}