1- using System . Collections . Generic ;
1+ using System ;
2+ using System . Collections . Generic ;
23using System . Linq ;
34
45namespace CppSharp . AST
@@ -17,25 +18,68 @@ public interface IAstVisitor<out T> : ITypeVisitor<T>,
1718 AstVisitorOptions VisitOptions { get ; }
1819 }
1920
21+ [ Flags ]
22+ public enum VisitFlags
23+ {
24+ /// <summary>
25+ /// We always visit classes, functions and declaration contexts.
26+ /// </summary>
27+ Default = 0 ,
28+
29+ ClassBases = 1 << 0 ,
30+ ClassFields = 1 << 1 ,
31+ ClassProperties = 1 << 2 ,
32+ ClassMethods = 1 << 3 ,
33+ ClassTemplateSpecializations = 1 << 4 ,
34+ PropertyAccessors = 1 << 5 ,
35+
36+ NamespaceEnums = 1 << 6 ,
37+ NamespaceTemplates = 1 << 7 ,
38+ NamespaceTypedefs = 1 << 8 ,
39+ NamespaceEvents = 1 << 9 ,
40+ NamespaceVariables = 1 << 10 ,
41+
42+ FunctionReturnType = 1 << 11 ,
43+ FunctionParameters = 1 << 12 ,
44+ EventParameters = 1 << 13 ,
45+ TemplateArguments = 1 << 14 ,
46+
47+ Any = ClassBases | ClassFields | ClassProperties | ClassMethods |
48+ ClassTemplateSpecializations | PropertyAccessors |
49+ NamespaceEnums | NamespaceTemplates | NamespaceTypedefs |
50+ NamespaceEvents | NamespaceVariables |
51+ FunctionReturnType | FunctionParameters |
52+ EventParameters | TemplateArguments
53+ }
54+
2055 public class AstVisitorOptions
2156 {
22- public bool VisitClassBases = true ;
23- public bool VisitClassFields = true ;
24- public bool VisitClassProperties = true ;
25- public bool VisitClassMethods = true ;
26- public bool VisitClassTemplateSpecializations { get ; set ; } = true ;
27- public bool VisitPropertyAccessors = false ;
28-
29- public bool VisitNamespaceEnums = true ;
30- public bool VisitNamespaceTemplates = true ;
31- public bool VisitNamespaceTypedefs = true ;
32- public bool VisitNamespaceEvents = true ;
33- public bool VisitNamespaceVariables = true ;
34-
35- public bool VisitFunctionReturnType = true ;
36- public bool VisitFunctionParameters = true ;
37- public bool VisitEventParameters = true ;
38- public bool VisitTemplateArguments = true ;
57+ public AstVisitorOptions ( VisitFlags flags )
58+ => this . flags = flags ;
59+
60+ public bool VisitClassBases => ( flags & VisitFlags . ClassBases ) != 0 ;
61+ public bool VisitClassFields => ( flags & VisitFlags . ClassFields ) != 0 ;
62+ public bool VisitClassProperties => ( flags & VisitFlags . ClassProperties ) != 0 ;
63+ public bool VisitClassMethods => ( flags & VisitFlags . ClassMethods ) != 0 ;
64+ public bool VisitClassTemplateSpecializations => ( flags & VisitFlags . ClassTemplateSpecializations ) != 0 ;
65+ public bool VisitPropertyAccessors => ( flags & VisitFlags . PropertyAccessors ) != 0 ;
66+
67+ public bool VisitNamespaceEnums => ( flags & VisitFlags . NamespaceEnums ) != 0 ;
68+ public bool VisitNamespaceTemplates => ( flags & VisitFlags . NamespaceTemplates ) != 0 ;
69+ public bool VisitNamespaceTypedefs => ( flags & VisitFlags . NamespaceTypedefs ) != 0 ;
70+ public bool VisitNamespaceEvents => ( flags & VisitFlags . NamespaceEvents ) != 0 ;
71+ public bool VisitNamespaceVariables => ( flags & VisitFlags . NamespaceVariables ) != 0 ;
72+
73+ public bool VisitFunctionReturnType => ( flags & VisitFlags . FunctionReturnType ) != 0 ;
74+ public bool VisitFunctionParameters => ( flags & VisitFlags . FunctionParameters ) != 0 ;
75+ public bool VisitEventParameters => ( flags & VisitFlags . EventParameters ) != 0 ;
76+ public bool VisitTemplateArguments => ( flags & VisitFlags . TemplateArguments ) != 0 ;
77+
78+ public void SetFlags ( VisitFlags flags ) => this . flags |= flags ;
79+ public void ResetFlags ( VisitFlags flags ) => this . flags = flags ;
80+ public void ClearFlags ( VisitFlags flags ) => this . flags &= ~ flags ;
81+
82+ private VisitFlags flags ;
3983 }
4084
4185 /// <summary>
@@ -46,14 +90,9 @@ public class AstVisitorOptions
4690 /// </summary>
4791 public abstract partial class AstVisitor : IAstVisitor < bool > , IAstVisited
4892 {
49- public ISet < object > Visited { get ; private set ; }
93+ public ISet < object > Visited { get ; private set ; } = new HashSet < object > ( ) ;
5094 public AstVisitorOptions VisitOptions { get ; private set ; }
51-
52- protected AstVisitor ( )
53- {
54- Visited = new HashSet < object > ( ) ;
55- VisitOptions = new AstVisitorOptions ( ) ;
56- }
95+ = new AstVisitorOptions ( VisitFlags . Any & ~ VisitFlags . PropertyAccessors ) ;
5796
5897 public bool AlreadyVisited ( Type type )
5998 {
0 commit comments