2
0

docs_format.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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 {
  101. // constants
  102. OdinDocType_ElemsCap = 4,
  103. };
  104. struct OdinDocType {
  105. OdinDocTypeKind kind;
  106. u32 flags;
  107. OdinDocString name;
  108. OdinDocString custom_align;
  109. // Used by some types
  110. u32 elem_count_len;
  111. i64 elem_counts[OdinDocType_ElemsCap];
  112. // Each of these is esed by some types, not all
  113. OdinDocString calling_convention;
  114. OdinDocArray<OdinDocTypeIndex> types;
  115. OdinDocArray<OdinDocEntityIndex> entities;
  116. OdinDocTypeIndex polmorphic_params;
  117. OdinDocArray<OdinDocString> where_clauses;
  118. };
  119. struct OdinDocAttribute {
  120. OdinDocString name;
  121. OdinDocString value;
  122. };
  123. enum OdinDocEntityKind : u32 {
  124. OdinDocEntity_Invalid = 0,
  125. OdinDocEntity_Constant = 1,
  126. OdinDocEntity_Variable = 2,
  127. OdinDocEntity_TypeName = 3,
  128. OdinDocEntity_Procedure = 4,
  129. OdinDocEntity_ProcGroup = 5,
  130. OdinDocEntity_ImportName = 6,
  131. OdinDocEntity_LibraryName = 7,
  132. };
  133. enum OdinDocEntityFlag : u32 {
  134. OdinDocEntityFlag_Foreign = 1<<0,
  135. OdinDocEntityFlag_Export = 1<<1,
  136. OdinDocEntityFlag_Param_Using = 1<<2,
  137. OdinDocEntityFlag_Param_Const = 1<<3,
  138. OdinDocEntityFlag_Param_AutoCast = 1<<4,
  139. OdinDocEntityFlag_Param_Ellipsis = 1<<5,
  140. OdinDocEntityFlag_Param_CVararg = 1<<6,
  141. OdinDocEntityFlag_Param_NoAlias = 1<<7,
  142. OdinDocEntityFlag_Type_Alias = 1<<8,
  143. OdinDocEntityFlag_Var_Thread_Local = 1<<9,
  144. };
  145. struct OdinDocEntity {
  146. OdinDocEntityKind kind;
  147. u32 flags;
  148. OdinDocPosition pos;
  149. OdinDocString name;
  150. OdinDocTypeIndex type;
  151. OdinDocString init_string;
  152. u32 reserved_for_init;
  153. OdinDocString comment;
  154. OdinDocString docs;
  155. OdinDocEntityIndex foreign_library;
  156. OdinDocString link_name;
  157. OdinDocArray<OdinDocAttribute> attributes;
  158. OdinDocArray<OdinDocEntityIndex> grouped_entities; // Procedure Groups
  159. OdinDocArray<OdinDocString> where_clauses; // Procedures
  160. };
  161. enum OdinDocPkgFlags : u32 {
  162. OdinDocPkgFlag_Builtin = 1<<0,
  163. OdinDocPkgFlag_Runtime = 1<<1,
  164. OdinDocPkgFlag_Init = 1<<2,
  165. };
  166. struct OdinDocPkg {
  167. OdinDocString fullpath;
  168. OdinDocString name;
  169. u32 flags;
  170. OdinDocString docs;
  171. OdinDocArray<OdinDocFileIndex> files;
  172. OdinDocArray<OdinDocEntityIndex> entities;
  173. };
  174. struct OdinDocHeader {
  175. OdinDocHeaderBase base;
  176. OdinDocArray<OdinDocFile> files;
  177. OdinDocArray<OdinDocPkg> pkgs;
  178. OdinDocArray<OdinDocEntity> entities;
  179. OdinDocArray<OdinDocType> types;
  180. };