mirror of https://github.com/mono/CppSharp.git
c-sharpdotnetmonobindingsbridgecclangcpluspluscppsharpglueinteropparserparsingpinvokeswigsyntax-treevisitorsxamarinxamarin-bindings
97 lines
3.9 KiB
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; |
|
} |
|
} |
|
} |
|
}
|
|
|