docs_format.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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 0
  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_RelativePointer = 20,
  72. OdinDocType_RelativeMultiPointer = 21,
  73. OdinDocType_MultiPointer = 22,
  74. OdinDocType_Matrix = 23,
  75. OdinDocType_SoaPointer = 24,
  76. OdinDocType_BitField = 25,
  77. };
  78. enum OdinDocTypeFlag_Basic : u32 {
  79. OdinDocTypeFlag_Basic_untyped = 1<<1,
  80. };
  81. enum OdinDocTypeFlag_Struct : u32 {
  82. OdinDocTypeFlag_Struct_polymorphic = 1<<0,
  83. OdinDocTypeFlag_Struct_packed = 1<<1,
  84. OdinDocTypeFlag_Struct_raw_union = 1<<2,
  85. };
  86. enum OdinDocTypeFlag_Union : u32 {
  87. OdinDocTypeFlag_Union_polymorphic = 1<<0,
  88. OdinDocTypeFlag_Union_no_nil = 1<<1,
  89. OdinDocTypeFlag_Union_shared_nil = 1<<3,
  90. };
  91. enum OdinDocTypeFlag_Proc : u32 {
  92. OdinDocTypeFlag_Proc_polymorphic = 1<<0,
  93. OdinDocTypeFlag_Proc_diverging = 1<<1,
  94. OdinDocTypeFlag_Proc_optional_ok = 1<<2,
  95. OdinDocTypeFlag_Proc_variadic = 1<<3,
  96. OdinDocTypeFlag_Proc_c_vararg = 1<<4,
  97. };
  98. enum OdinDocTypeFlag_BitSet : u32 {
  99. OdinDocTypeFlag_BitSet_Range = 1<<1,
  100. OdinDocTypeFlag_BitSet_OpLt = 1<<2,
  101. OdinDocTypeFlag_BitSet_OpLtEq = 1<<3,
  102. OdinDocTypeFlag_BitSet_UnderlyingType = 1<<4,
  103. };
  104. enum {
  105. // constants
  106. OdinDocType_ElemsCap = 4,
  107. };
  108. struct OdinDocType {
  109. OdinDocTypeKind kind;
  110. u32 flags;
  111. OdinDocString name;
  112. OdinDocString custom_align;
  113. // Used by some types
  114. u32 elem_count_len;
  115. i64 elem_counts[OdinDocType_ElemsCap];
  116. // Each of these is esed by some types, not all
  117. OdinDocString calling_convention;
  118. OdinDocArray<OdinDocTypeIndex> types;
  119. OdinDocArray<OdinDocEntityIndex> entities;
  120. OdinDocTypeIndex polmorphic_params;
  121. OdinDocArray<OdinDocString> where_clauses;
  122. OdinDocArray<OdinDocString> tags; // struct field tags
  123. };
  124. struct OdinDocAttribute {
  125. OdinDocString name;
  126. OdinDocString value;
  127. };
  128. enum OdinDocEntityKind : u32 {
  129. OdinDocEntity_Invalid = 0,
  130. OdinDocEntity_Constant = 1,
  131. OdinDocEntity_Variable = 2,
  132. OdinDocEntity_TypeName = 3,
  133. OdinDocEntity_Procedure = 4,
  134. OdinDocEntity_ProcGroup = 5,
  135. OdinDocEntity_ImportName = 6,
  136. OdinDocEntity_LibraryName = 7,
  137. OdinDocEntity_Builtin = 8,
  138. };
  139. enum OdinDocEntityFlag : u64 {
  140. OdinDocEntityFlag_Foreign = 1ull<<0,
  141. OdinDocEntityFlag_Export = 1ull<<1,
  142. OdinDocEntityFlag_Param_Using = 1ull<<2,
  143. OdinDocEntityFlag_Param_Const = 1ull<<3,
  144. OdinDocEntityFlag_Param_AutoCast = 1ull<<4,
  145. OdinDocEntityFlag_Param_Ellipsis = 1ull<<5,
  146. OdinDocEntityFlag_Param_CVararg = 1ull<<6,
  147. OdinDocEntityFlag_Param_NoAlias = 1ull<<7,
  148. OdinDocEntityFlag_Param_AnyInt = 1ull<<8,
  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. };