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