public void GenerateClassHeaderMembers(AST.Object type, bool fullIntellisense = false) { if (type.Origin != TypeOrigin.MappedIntermediary) { Line("#pragma region Gluon Maintained"); Line("// clang-format off"); } Region(() => { Indent++; var localTranslations = GenerateLocalTranslations(type); Indent--; Spacer(); LocalTranslationsBlock(localTranslations, () => { Line("public:"); Indent++; // ABI type declaration Line("typedef {0} ABIType;", TypeRef(type, true)); Spacer(); AST.Access currentAccess = AST.Access.Public; AST.Construct currentConstruct = AST.Construct.Void; foreach (var member in type.Members.OrderBy(m => m.Access)) { var access = member.Access; if (access == AST.Access.Internal) { access = AST.Access.Public; } if (access != currentAccess) { currentAccess = access; Indent--; Spacer(); Line(access.ToString().ToLower() + ":"); Indent++; } var construct = member.ConstructType; if (construct != currentConstruct) { Spacer(); currentConstruct = construct; } switch (construct) { case AST.Construct.Constructor: { var constructor = (AST.Constructor)member; Line("{0}({1});", type.Name, DeclParameters(true, constructor.Parameters)); } break; case AST.Construct.Event: { var ev = (AST.Event)member; if (ev.IsAbstract || ev.IsVirtual) { Line("VirtualEvent<{0}, {1}> {2}", Signature(ev), type.Name, ev.Name); Line(" {{ this, &{0}::Add{1}Handler, &{0}::Remove{1}Handler }};", type.Name, ev.Name); } else { Line("Event<{0}> {1} {{_{1}}};", Signature(ev), ev.Name); } } break; case AST.Construct.Property: { var prop = (AST.Property)member; Spacer(); Line("PROPERTY{0}({1}, {2});", prop.IsReadOnly ? "_READONLY" : "", VariableType(prop, (prop.Type.IsStruct || prop.Type.IsDelegate || (prop.Type.IsObject && prop.IsFactory)) ? AST.VariableContext.Return : AST.VariableContext.In), prop.Name); GenerateMethodDeclaration(type, prop.CreateGetter()); if (!prop.IsReadOnly) { GenerateMethodDeclaration(type, prop.CreateSetter()); } } break; case AST.Construct.Method: { var method = (AST.Method)member; GenerateMethodDeclaration(type, method); } break; default: throw new Exception("Oops, unhandled member type: " + construct.ToString()); } } Spacer(); if (currentAccess != AST.Access.Public) { Indent--; Line("public:"); Indent++; currentAccess = AST.Access.Public; } // Wrapped Interface Implementation foreach (var iface in type.Interfaces) { if (iface.Origin == TypeOrigin.Native) { continue; } BlockComment(() => Code(iface.Name)); foreach (var method in iface.Methods) { GenerateMethodDeclaration(type, method); } Spacer(); } Spacer(); foreach (var ev in type.Events) { if (currentAccess != AST.Access.Private) { Indent--; Line("private:"); Indent++; currentAccess = AST.Access.Private; } if (ev.IsAbstract || ev.IsVirtual) { Line("virtual void Add{0}Handler(const Delegate<{1}>& handler){2};", ev.Name, Signature(ev), ev.IsAbstract ? " = 0" : ""); Line("virtual void Remove{0}Handler(const Delegate<{1}>& handler){2};", ev.Name, Signature(ev), ev.IsAbstract ? " = 0" : ""); } else { Line("EventTrigger<{0}> _{1};", Signature(ev), ev.Name); } } Spacer(); Strata = ApiStrata.ABI; if (currentAccess != AST.Access.Private) { Indent--; Line("private:"); Indent++; currentAccess = AST.Access.Private; } // ABI interface members GenerateInterfaceMembers(type, false, fullIntellisense); Spacer(); foreach (var iface in type.Interfaces) { if (iface.Origin == TypeOrigin.Native) { continue; } GenerateInterfaceMembers(iface, false, fullIntellisense); Spacer(); } Strata = ApiStrata.Normal; }); }); Indent--; if (type.Origin != TypeOrigin.MappedIntermediary) { Line("// clang-format on"); Line("#pragma endregion"); } }
public void GenerateWrapperHeaderMembers(AST.Object type) { Line("#pragma region Gluon Maintained"); Line("// clang-format off"); Line($" typedef {(type.BaseType == null ? "ABI::Wrapper" : TypeRef(type.BaseType))} Base;"); Line($" WRAPPER_CORE({type.Name}, ::ABI::{type.FullName("::")})"); AST.Construct currentConstruct = AST.Construct.Constructor; Indent++; Region(() => { var localTranslations = GenerateLocalTranslations(type); UseLocalTranslations = true; LocalTranslationsBlock(localTranslations, () => { //Spacer(); //Line($"{type.Name}();"); //Line($"{type.Name}(std::nullptr_t);"); //Line($"{type.Name}(const {type.Name}& copy);"); //Line($"{type.Name}({type.Name}&& move);"); var currentAccess = AST.Access.Private; foreach (var member in type.Members /*.Where(m => m.Access == AST.Access.Public)*/.OrderBy(m => m.ConstructType).OrderBy(m => m.Access)) { if (member is AST.Constructor) { continue; } if (member.ConstructType != currentConstruct) { Spacer(); currentConstruct = member.ConstructType; } if (member.Access != currentAccess) { Spacer(); Indent--; Line($"{member.Access.ToString().ToLower()}:"); Indent++; currentAccess = member.Access; } WriteXmlDocumentation(member.XmlDoc); switch (member) { case AST.Constructor constructor: //Line("{0}({1});", type.Name, DeclParameters(true, constructor.Parameters)); break; case AST.Event ev: Line($"VirtualEvent<{Signature(ev)}, {type.Name}> {ev.Name}"); Line(" {{ this, &{0}::Add{1}Handler, &{0}::Remove{1}Handler }};", type.Name, ev.Name); break; case AST.Property prop: Line("PROPERTY{0}({1}, {2});", prop.IsReadOnly ? "_READONLY" : "", VariableType(prop, (prop.Type.IsStruct || prop.Type.IsDelegate || (prop.Type.IsObject && prop.IsFactory)) ? AST.VariableContext.Return : AST.VariableContext.In), prop.Name); GenerateMethodDeclaration(type, prop.CreateGetter().AsConst()); if (!prop.IsReadOnly) { GenerateMethodDeclaration(type, prop.CreateSetter().AsConst()); } break; case AST.Method method: GenerateMethodDeclaration(type, method.AsConst()); break; default: throw new Exception("Oops, unhandled member type: " + member.ConstructType.ToString()); } } var allEvents = type.Members.Where(m => m.Access == AST.Access.Public).OfType <AST.Event>().ToArray(); if (allEvents != null && allEvents.Length > 0) { Spacer(); Indent--; Line("private:"); Indent++; Spacer(); foreach (var ev in allEvents) { GenerateMethodDeclaration(type, ev.CreateAdder().AsConst()); GenerateMethodDeclaration(type, ev.CreateRemover().AsConst()); } } }); }); Indent--; Spacer(); Line("// clang-format on"); Line("#pragma endregion"); }