Tools and libraries to glue C/C++ APIs to high-level languages
 
 
 
 
 

97 lines
3.9 KiB

using System.Linq;
using CppSharp.AST;
using CppSharp.AST.Extensions;
namespace CppSharp.Passes
{
public class IgnoreSystemDeclarationsPass : TranslationUnitPass
{
public IgnoreSystemDeclarationsPass()
{
Options.VisitClassBases = false;
Options.VisitClassFields = false;
Options.VisitClassMethods = false;
Options.VisitClassProperties = false;
Options.VisitFunctionParameters = false;
Options.VisitFunctionReturnType = false;
Options.VisitNamespaceEnums = false;
Options.VisitNamespaceEvents = false;
Options.VisitNamespaceTemplates = false;
Options.VisitNamespaceTypedefs = false;
Options.VisitNamespaceVariables = false;
Options.VisitTemplateArguments = false;
}
public override bool VisitTranslationUnit(TranslationUnit unit)
{
if (!unit.IsValid)
return false;
if (unit.IsSystemHeader)
unit.ExplicitlyIgnore();
if (ClearVisitedDeclarations)
Visited.Clear();
VisitDeclarationContext(unit);
return true;
}
public override bool VisitDeclaration(Declaration decl)
{
if (decl.Namespace != null && decl.TranslationUnit.IsSystemHeader)
decl.ExplicitlyIgnore();
return base.VisitDeclaration(decl);
}
public override bool VisitClassDecl(Class @class)
{
if (!base.VisitClassDecl(@class) || !@class.IsDependent ||
Driver.Options.IsCLIGenerator || !@class.IsSupportedStdType())
return false;
// we only need a few members for marshalling so strip the rest
switch (@class.Name)
{
case "basic_string":
foreach (var specialization in @class.Specializations.Where(
s => s.IsSupportedStdSpecialization()))
{
MarkForGeneration(specialization);
foreach (var method in specialization.Methods.Where(m => m.OriginalName != "c_str"))
method.ExplicitlyIgnore();
var l = specialization.Methods.Where(m => m.IsConstructor && m.Parameters.Count == 2).ToList();
var ctor = specialization.Methods.Single(m => m.IsConstructor && m.Parameters.Count == 2 &&
m.Parameters[0].Type.Desugar().IsPointerToPrimitiveType(PrimitiveType.Char) &&
!m.Parameters[1].Type.Desugar().IsPrimitiveType());
ctor.GenerationKind = GenerationKind.Generate;
foreach (var parameter in ctor.Parameters)
parameter.DefaultArgument = null;
}
break;
case "allocator":
foreach (var specialization in @class.Specializations.Where(
s => s.IsSupportedStdSpecialization()))
{
MarkForGeneration(specialization);
foreach (var method in specialization.Methods.Where(m => !m.IsConstructor || m.Parameters.Any()))
method.ExplicitlyIgnore();
}
break;
}
return true;
}
private static void MarkForGeneration(ClassTemplateSpecialization specialization)
{
specialization.GenerationKind = GenerationKind.Generate;
Declaration declaration = specialization.TemplatedDecl.TemplatedDecl;
while (declaration != null)
{
declaration.GenerationKind = GenerationKind.Generate;
declaration = declaration.Namespace;
}
}
}
}