docs_format.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. #define OdinDocHeader_MagicString "odindoc\0"
  2. template <typename T>
  3. struct OdinDocArray {
  4. u32 offset;
  5. u32 length;
  6. };
  7. using OdinDocString = OdinDocArray<u8>;
  8. struct OdinDocVersionType {
  9. u8 major, minor, patch;
  10. u8 pad0;
  11. };
  12. #define OdinDocVersionType_Major 0
  13. #define OdinDocVersionType_Minor 3
  14. #define OdinDocVersionType_Patch 1
  15. struct OdinDocHeaderBase {
  16. u8 magic[8];
  17. u32 padding0;
  18. OdinDocVersionType version;
  19. u32 total_size;
  20. u32 header_size;
  21. u32 hash; // after header
  22. };
  23. template <typename T>
  24. gb_internal Slice<T> from_array(OdinDocHeaderBase *base, OdinDocArray<T> const &a) {
  25. Slice<T> s = {};
  26. s.data = cast(T *)(cast(uintptr)base + cast(uintptr)a.offset);
  27. s.count = cast(isize)a.length;
  28. return s;
  29. }
  30. gb_internal String from_string(OdinDocHeaderBase *base, OdinDocString const &s) {
  31. String str = {};
  32. str.text = cast(u8 *)(cast(uintptr)base + cast(uintptr)s.offset);
  33. str.len = cast(isize)s.length;
  34. return str;
  35. }
  36. typedef u32 OdinDocFileIndex;
  37. typedef u32 OdinDocPkgIndex;
  38. typedef u32 OdinDocEntityIndex;
  39. typedef u32 OdinDocTypeIndex;
  40. struct OdinDocFile {
  41. OdinDocPkgIndex pkg;
  42. OdinDocString name;
  43. };
  44. struct OdinDocPosition {
  45. OdinDocFileIndex file;
  46. u32 line;
  47. u32 column;
  48. u32 offset;
  49. };
  50. enum OdinDocTypeKind : u32 {
  51. OdinDocType_Invalid = 0,
  52. OdinDocType_Basic = 1,
  53. OdinDocType_Named = 2,
  54. OdinDocType_Generic = 3,
  55. OdinDocType_Pointer = 4,
  56. OdinDocType_Array = 5,
  57. OdinDocType_EnumeratedArray = 6,
  58. OdinDocType_Slice = 7,
  59. OdinDocType_DynamicArray = 8,
  60. OdinDocType_Map = 9,
  61. OdinDocType_Struct = 10,
  62. OdinDocType_Union = 11,
  63. OdinDocType_Enum = 12,
  64. OdinDocType_Tuple = 13,
  65. OdinDocType_Proc = 14,
  66. OdinDocType_BitSet = 15,
  67. OdinDocType_SimdVector = 16,
  68. OdinDocType_SOAStructFixed = 17,
  69. OdinDocType_SOAStructSlice = 18,
  70. OdinDocType_SOAStructDynamic = 19,
  71. OdinDocType_MultiPointer = 22,
  72. OdinDocType_Matrix = 23,
  73. OdinDocType_SoaPointer = 24,
  74. OdinDocType_BitField = 25,
  75. };
  76. enum OdinDocTypeFlag_Basic : u32 {
  77. OdinDocTypeFlag_Basic_untyped = 1<<1,
  78. };
  79. enum OdinDocTypeFlag_Struct : u32 {
  80. OdinDocTypeFlag_Struct_polymorphic = 1<<0,
  81. OdinDocTypeFlag_Struct_packed = 1<<1,
  82. OdinDocTypeFlag_Struct_raw_union = 1<<2,
  83. };
  84. enum OdinDocTypeFlag_Union : u32 {
  85. OdinDocTypeFlag_Union_polymorphic = 1<<0,
  86. OdinDocTypeFlag_Union_no_nil = 1<<1,
  87. OdinDocTypeFlag_Union_shared_nil = 1<<3,
  88. };
  89. enum OdinDocTypeFlag_Proc : u32 {
  90. OdinDocTypeFlag_Proc_polymorphic = 1<<0,
  91. OdinDocTypeFlag_Proc_diverging = 1<<1,
  92. OdinDocTypeFlag_Proc_optional_ok = 1<<2,
  93. OdinDocTypeFlag_Proc_variadic = 1<<3,
  94. OdinDocTypeFlag_Proc_c_vararg = 1<<4,
  95. };
  96. enum OdinDocTypeFlag_BitSet : u32 {
  97. OdinDocTypeFlag_BitSet_Range = 1<<1,
  98. OdinDocTypeFlag_BitSet_OpLt = 1<<2,
  99. OdinDocTypeFlag_BitSet_OpLtEq = 1<<3,
  100. OdinDocTypeFlag_BitSet_UnderlyingType = 1<<4,
  101. };
  102. enum {
  103. // constants
  104. OdinDocType_ElemsCap = 4,
  105. };
  106. struct OdinDocType {
  107. OdinDocTypeKind kind;
  108. u32 flags;
  109. OdinDocString name;
  110. OdinDocString custom_align;
  111. // Used by some types
  112. u32 elem_count_len;
  113. i64 elem_counts[OdinDocType_ElemsCap];
  114. // Each of these is esed by some types, not all
  115. OdinDocString calling_convention;
  116. OdinDocArray<OdinDocTypeIndex> types;
  117. OdinDocArray<OdinDocEntityIndex> entities;
  118. OdinDocTypeIndex polmorphic_params;
  119. OdinDocArray<OdinDocString> where_clauses;
  120. OdinDocArray<OdinDocString> tags; // struct field tags
  121. };
  122. struct OdinDocAttribute {
  123. OdinDocString name;
  124. OdinDocString value;
  125. };
  126. enum OdinDocEntityKind : u32 {
  127. OdinDocEntity_Invalid = 0,
  128. OdinDocEntity_Constant = 1,
  129. OdinDocEntity_Variable = 2,
  130. OdinDocEntity_TypeName = 3,
  131. OdinDocEntity_Procedure = 4,
  132. OdinDocEntity_ProcGroup = 5,
  133. OdinDocEntity_ImportName = 6,
  134. OdinDocEntity_LibraryName = 7,
  135. OdinDocEntity_Builtin = 8,
  136. };
  137. enum OdinDocEntityFlag : u64 {
  138. OdinDocEntityFlag_Foreign = 1ull<<0,
  139. OdinDocEntityFlag_Export = 1ull<<1,
  140. OdinDocEntityFlag_Param_Using = 1ull<<2,
  141. OdinDocEntityFlag_Param_Const = 1ull<<3,
  142. OdinDocEntityFlag_Param_AutoCast = 1ull<<4,
  143. OdinDocEntityFlag_Param_Ellipsis = 1ull<<5,
  144. OdinDocEntityFlag_Param_CVararg = 1ull<<6,
  145. OdinDocEntityFlag_Param_NoAlias = 1ull<<7,
  146. OdinDocEntityFlag_Param_AnyInt = 1ull<<8,
  147. OdinDocEntityFlag_Param_ByPtr = 1ull<<9,
  148. OdinDocEntityFlag_Param_NoBroadcast = 1ull<<10,
  149. OdinDocEntityFlag_BitField_Field = 1ull<<19,
  150. OdinDocEntityFlag_Type_Alias = 1ull<<20,
  151. OdinDocEntityFlag_Builtin_Pkg_Builtin = 1ull<<30,
  152. OdinDocEntityFlag_Builtin_Pkg_Intrinsics = 1ull<<31,
  153. OdinDocEntityFlag_Var_Thread_Local = 1ull<<40,
  154. OdinDocEntityFlag_Var_Static = 1ull<<41,
  155. OdinDocEntityFlag_Private = 1ull<<50,
  156. };
  157. struct OdinDocEntity {
  158. OdinDocEntityKind kind;
  159. u32 reserved;
  160. u64 flags;
  161. OdinDocPosition pos;
  162. OdinDocString name;
  163. OdinDocTypeIndex type;
  164. OdinDocString init_string;
  165. u32 reserved_for_init;
  166. OdinDocString comment; // line comment
  167. OdinDocString docs; // preceding comment
  168. i32 field_group_index; // For `bit_field`s this is the "bit_size"
  169. OdinDocEntityIndex foreign_library;
  170. OdinDocString link_name;
  171. OdinDocArray<OdinDocAttribute> attributes;
  172. OdinDocArray<OdinDocEntityIndex> grouped_entities; // Procedure Groups
  173. OdinDocArray<OdinDocString> where_clauses; // Procedures
  174. };
  175. enum OdinDocPkgFlags : u32 {
  176. OdinDocPkgFlag_Builtin = 1<<0,
  177. OdinDocPkgFlag_Runtime = 1<<1,
  178. OdinDocPkgFlag_Init = 1<<2,
  179. };
  180. struct OdinDocScopeEntry {
  181. OdinDocString name;
  182. OdinDocEntityIndex entity;
  183. };
  184. struct OdinDocPkg {
  185. OdinDocString fullpath;
  186. OdinDocString name;
  187. u32 flags;
  188. OdinDocString docs;
  189. OdinDocArray<OdinDocFileIndex> files;
  190. OdinDocArray<OdinDocScopeEntry> entries;
  191. };
  192. struct OdinDocHeader {
  193. OdinDocHeaderBase base;
  194. OdinDocArray<OdinDocFile> files;
  195. OdinDocArray<OdinDocPkg> pkgs;
  196. OdinDocArray<OdinDocEntity> entities;
  197. OdinDocArray<OdinDocType> types;
  198. };