using CppSharp.AST; using CppSharp.Generators; namespace CppSharp.Passes { /// /// Used to provide different types of code transformation on a module /// declarations and types before the code generation process is started. /// public abstract class TranslationUnitPass : AstVisitor { public Driver Driver { get; set; } public ASTContext AstContext { get; set; } public IDiagnosticConsumer Log { get { return Driver.Diagnostics; } } public bool ClearVisitedDeclarations = false; public virtual bool VisitLibrary(ASTContext context) { AstContext = context; foreach (var unit in context.TranslationUnits) VisitTranslationUnit(unit); return true; } public virtual bool VisitTranslationUnit(TranslationUnit unit) { if (!unit.IsValid) return false; if (unit.IsSystemHeader) return false; if (ClearVisitedDeclarations) Visited.Clear(); VisitDeclarationContext(unit); return true; } public override bool VisitDeclaration(Declaration decl) { return !IsDeclExcluded(decl) && base.VisitDeclaration(decl); } bool IsDeclExcluded(Declaration decl) { var type = this.GetType(); return decl.ExcludeFromPasses.Contains(type); } } /// /// Used to modify generated output. /// public abstract class GeneratorOutputPass { public Driver Driver { get; set; } public virtual void VisitGeneratorOutput(GeneratorOutput output) { } } }