docs_format.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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 1
  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. 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. 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_RelativeSlice = 21,
  73. };
  74. enum OdinDocTypeFlag_Basic : u32 {
  75. OdinDocTypeFlag_Basic_untyped = 1<<1,
  76. };
  77. enum OdinDocTypeFlag_Struct : u32 {
  78. OdinDocTypeFlag_Struct_polymorphic = 1<<0,
  79. OdinDocTypeFlag_Struct_packed = 1<<1,
  80. OdinDocTypeFlag_Struct_raw_union = 1<<2,
  81. };
  82. enum OdinDocTypeFlag_Union : u32 {
  83. OdinDocTypeFlag_Union_polymorphic = 1<<0,
  84. OdinDocTypeFlag_Union_no_nil = 1<<1,
  85. OdinDocTypeFlag_Union_maybe = 1<<2,
  86. };
  87. enum OdinDocTypeFlag_Proc : u32 {
  88. OdinDocTypeFlag_Proc_polymorphic = 1<<0,
  89. OdinDocTypeFlag_Proc_diverging = 1<<1,
  90. OdinDocTypeFlag_Proc_optional_ok = 1<<2,
  91. OdinDocTypeFlag_Proc_variadic = 1<<3,
  92. OdinDocTypeFlag_Proc_c_vararg = 1<<4,
  93. };
  94. enum OdinDocTypeFlag_BitSet : u32 {
  95. OdinDocTypeFlag_BitSet_Range = 1<<1,
  96. OdinDocTypeFlag_BitSet_OpLt = 1<<2,
  97. OdinDocTypeFlag_BitSet_OpLtEq = 1<<3,
  98. OdinDocTypeFlag_BitSet_UnderlyingType = 1<<4,
  99. };
  100. enum OdinDocTypeFlag_SimdVector : u32 {
  101. OdinDocTypeFlag_BitSet_x86_mmx = 1<<1,
  102. };
  103. enum {
  104. // constants
  105. OdinDocType_ElemsCap = 4,
  106. };
  107. struct OdinDocType {
  108. OdinDocTypeKind kind;
  109. u32 flags;
  110. OdinDocString name;
  111. OdinDocString custom_align;
  112. // Used by some types
  113. u32 elem_count_len;
  114. i64 elem_counts[OdinDocType_ElemsCap];
  115. // Each of these is esed by some types, not all
  116. OdinDocString calling_convention;
  117. OdinDocArray<OdinDocTypeIndex> types;
  118. OdinDocArray<OdinDocEntityIndex> entities;
  119. OdinDocTypeIndex polmorphic_params;
  120. OdinDocArray<OdinDocString> where_clauses;
  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. };
  136. enum OdinDocEntityFlag : u32 {
  137. OdinDocEntityFlag_Foreign = 1<<0,
  138. OdinDocEntityFlag_Export = 1<<1,
  139. OdinDocEntityFlag_Param_Using = 1<<2,
  140. OdinDocEntityFlag_Param_Const = 1<<3,
  141. OdinDocEntityFlag_Param_AutoCast = 1<<4,
  142. OdinDocEntityFlag_Param_Ellipsis = 1<<5,
  143. OdinDocEntityFlag_Param_CVararg = 1<<6,
  144. OdinDocEntityFlag_Param_NoAlias = 1<<7,
  145. OdinDocEntityFlag_Type_Alias = 1<<8,
  146. OdinDocEntityFlag_Var_Thread_Local = 1<<9,
  147. };
  148. struct OdinDocEntity {
  149. OdinDocEntityKind kind;
  150. u32 flags;
  151. OdinDocPosition pos;
  152. OdinDocString name;
  153. OdinDocTypeIndex type;
  154. OdinDocString init_string;
  155. u32 reserved_for_init;
  156. OdinDocString comment;
  157. OdinDocString docs;
  158. OdinDocEntityIndex foreign_library;
  159. OdinDocString link_name;
  160. OdinDocArray<OdinDocAttribute> attributes;
  161. OdinDocArray<OdinDocEntityIndex> grouped_entities; // Procedure Groups
  162. OdinDocArray<OdinDocString> where_clauses; // Procedures
  163. };
  164. enum OdinDocPkgFlags : u32 {
  165. OdinDocPkgFlag_Builtin = 1<<0,
  166. OdinDocPkgFlag_Runtime = 1<<1,
  167. OdinDocPkgFlag_Init = 1<<2,
  168. };
  169. struct OdinDocPkg {
  170. OdinDocString fullpath;
  171. OdinDocString name;
  172. u32 flags;
  173. OdinDocString docs;
  174. OdinDocArray<OdinDocFileIndex> files;
  175. OdinDocArray<OdinDocEntityIndex> entities;
  176. };
  177. struct OdinDocHeader {
  178. OdinDocHeaderBase base;
  179. OdinDocArray<OdinDocFile> files;
  180. OdinDocArray<OdinDocPkg> pkgs;
  181. OdinDocArray<OdinDocEntity> entities;
  182. OdinDocArray<OdinDocType> types;
  183. };