using System; using System.Collections.Generic; using CppSharp.AST; namespace CppSharp.Generators { public abstract class CodeGenerator : BlockGenerator, IDeclVisitor { public BindingContext Context { get; } public DriverOptions Options => Context.Options; public List TranslationUnits { get; } public TranslationUnit TranslationUnit => TranslationUnits[0]; public abstract string FileExtension { get; } protected CodeGenerator(BindingContext context, TranslationUnit unit) : this(context, new List { unit }) { } protected CodeGenerator(BindingContext context, IEnumerable units) { Context = context; TranslationUnits = new List(units); } public abstract void Process(); public override string Generate() { if (Options.IsCSharpGenerator && Options.CompileCode) return base.GenerateUnformatted(); return base.Generate(); } public virtual void GenerateFilePreamble() { PushBlock(BlockKind.Header); WriteLine("//----------------------------------------------------------------------------"); WriteLine("// "); WriteLine("// This is autogenerated code by CppSharp."); WriteLine("// Do not edit this file or all your changes will be lost after re-generation."); WriteLine("// "); WriteLine("//----------------------------------------------------------------------------"); PopBlock(); } #region Visitor methods public virtual bool VisitDeclaration(Declaration decl) { throw new NotImplementedException(); } public virtual bool VisitDeclContext(DeclarationContext context) { foreach (var decl in context.Declarations) if (!decl.IsGenerated) decl.Visit(this); return true; } public virtual bool VisitClassDecl(Class @class) { return VisitDeclContext(@class); } public virtual bool VisitFieldDecl(Field field) { throw new NotImplementedException(); } public virtual bool VisitFunctionDecl(Function function) { throw new NotImplementedException(); } public virtual bool VisitMethodDecl(Method method) { throw new NotImplementedException(); } public virtual bool VisitParameterDecl(Parameter parameter) { throw new NotImplementedException(); } public virtual bool VisitTypedefDecl(TypedefDecl typedef) { throw new NotImplementedException(); } public virtual bool VisitTypeAliasDecl(TypeAlias typeAlias) { throw new NotImplementedException(); } public virtual bool VisitEnumDecl(Enumeration @enum) { throw new NotImplementedException(); } public virtual bool VisitEnumItemDecl(Enumeration.Item item) { throw new NotImplementedException(); } public virtual bool VisitVariableDecl(Variable variable) { throw new NotImplementedException(); } public virtual bool VisitMacroDefinition(MacroDefinition macro) { throw new NotImplementedException(); } public virtual bool VisitNamespace(Namespace @namespace) { return VisitDeclContext(@namespace); } public virtual bool VisitEvent(Event @event) { throw new NotImplementedException(); } public virtual bool VisitProperty(Property property) { throw new NotImplementedException(); } public virtual bool VisitFriend(Friend friend) { throw new NotImplementedException(); } public virtual bool VisitClassTemplateDecl(ClassTemplate template) { throw new NotImplementedException(); } public virtual bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization) { return VisitClassDecl(specialization); } public virtual bool VisitFunctionTemplateDecl(FunctionTemplate template) { throw new NotImplementedException(); } public virtual bool VisitFunctionTemplateSpecializationDecl(FunctionTemplateSpecialization specialization) { throw new NotImplementedException(); } public virtual bool VisitVarTemplateDecl(VarTemplate template) { throw new NotImplementedException(); } public virtual bool VisitVarTemplateSpecializationDecl(VarTemplateSpecialization template) { throw new NotImplementedException(); } public virtual bool VisitTemplateTemplateParameterDecl(TemplateTemplateParameter templateTemplateParameter) { throw new NotImplementedException(); } public virtual bool VisitTemplateParameterDecl(TypeTemplateParameter templateParameter) { throw new NotImplementedException(); } public virtual bool VisitNonTypeTemplateParameterDecl(NonTypeTemplateParameter nonTypeTemplateParameter) { throw new NotImplementedException(); } public virtual bool VisitTypeAliasTemplateDecl(TypeAliasTemplate typeAliasTemplate) { throw new NotImplementedException(); } #endregion } }