public CCodeGenerator(BindingContext context, IEnumerable <TranslationUnit> units = null) : base(context, units) { VisitOptions.SetFlags(VisitFlags.PropertyAccessors); typePrinter = new CppTypePrinter(context); }
public override void Process() { GenerateFilePreamble(CommentKind.BCPL); PushBlock(BlockKind.Includes); { WriteInclude("CppSharp_QuickJS.h", CInclude.IncludeKind.Angled); WriteInclude("assert.h", CInclude.IncludeKind.Angled); foreach (var unit in TranslationUnits) { WriteInclude(unit.IncludePath, CInclude.IncludeKind.Angled); } NewLine(); } PopBlock(); WriteLine("extern \"C\" {"); NewLine(); GenerateExternClassIds(); var registerGen = new QuickJSRegister(Context, TranslationUnits); registerGen.Process(); WriteLine(registerGen.Generate()); PushBlock(); { var name = GetTranslationUnitName(TranslationUnit); WriteLine($"void register_{name}(JSContext *ctx, JSModuleDef *m, bool set, int phase)"); WriteOpenBraceAndIndent(); Block registerBlock; PushBlock(); { WriteLine("if (phase == 0)"); WriteOpenBraceAndIndent(); { PushBlock(); VisitOptions.ClearFlags(VisitFlags.NamespaceClasses); TranslationUnit.Visit(this); registerBlock = PopBlock(); } UnindentAndWriteCloseBrace(); } var phase0Block = PopBlock(NewLineKind.IfNotEmpty); phase0Block.CheckGenerate = () => !registerBlock.IsEmpty; PushBlock(); { VisitOptions.ResetFlags(VisitFlags.Default); VisitOptions.SetFlags(VisitFlags.NamespaceClasses); TranslationUnit.Visit(this); } PopBlock(NewLineKind.IfNotEmpty); UnindentAndWriteCloseBrace(); } PopBlock(NewLineKind.BeforeNextBlock); NewLine(); WriteLine("} // extern \"C\""); }