docs_format.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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 2
  14. #define OdinDocVersionType_Patch 4
  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. OdinDocType_MultiPointer = 22,
  74. OdinDocType_Matrix = 23,
  75. OdinDocType_SoaPointer = 24,
  76. };
  77. enum OdinDocTypeFlag_Basic : u32 {
  78. OdinDocTypeFlag_Basic_untyped = 1<<1,
  79. };
  80. enum OdinDocTypeFlag_Struct : u32 {
  81. OdinDocTypeFlag_Struct_polymorphic = 1<<0,
  82. OdinDocTypeFlag_Struct_packed = 1<<1,
  83. OdinDocTypeFlag_Struct_raw_union = 1<<2,
  84. };
  85. enum OdinDocTypeFlag_Union : u32 {
  86. OdinDocTypeFlag_Union_polymorphic = 1<<0,
  87. OdinDocTypeFlag_Union_no_nil = 1<<1,
  88. OdinDocTypeFlag_Union_shared_nil = 1<<3,
  89. };
  90. enum OdinDocTypeFlag_Proc : u32 {
  91. OdinDocTypeFlag_Proc_polymorphic = 1<<0,
  92. OdinDocTypeFlag_Proc_diverging = 1<<1,
  93. OdinDocTypeFlag_Proc_optional_ok = 1<<2,
  94. OdinDocTypeFlag_Proc_variadic = 1<<3,
  95. OdinDocTypeFlag_Proc_c_vararg = 1<<4,
  96. };
  97. enum OdinDocTypeFlag_BitSet : u32 {
  98. OdinDocTypeFlag_BitSet_Range = 1<<1,
  99. OdinDocTypeFlag_BitSet_OpLt = 1<<2,
  100. OdinDocTypeFlag_BitSet_OpLtEq = 1<<3,
  101. OdinDocTypeFlag_BitSet_UnderlyingType = 1<<4,
  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. OdinDocArray<OdinDocString> tags; // struct field tags
  122. };
  123. struct OdinDocAttribute {
  124. OdinDocString name;
  125. OdinDocString value;
  126. };
  127. enum OdinDocEntityKind : u32 {
  128. OdinDocEntity_Invalid = 0,
  129. OdinDocEntity_Constant = 1,
  130. OdinDocEntity_Variable = 2,
  131. OdinDocEntity_TypeName = 3,
  132. OdinDocEntity_Procedure = 4,
  133. OdinDocEntity_ProcGroup = 5,
  134. OdinDocEntity_ImportName = 6,
  135. OdinDocEntity_LibraryName = 7,
  136. OdinDocEntity_Builtin = 8,
  137. };
  138. enum OdinDocEntityFlag : u64 {
  139. OdinDocEntityFlag_Foreign = 1ull<<0,
  140. OdinDocEntityFlag_Export = 1ull<<1,
  141. OdinDocEntityFlag_Param_Using = 1ull<<2,
  142. OdinDocEntityFlag_Param_Const = 1ull<<3,
  143. OdinDocEntityFlag_Param_AutoCast = 1ull<<4,
  144. OdinDocEntityFlag_Param_Ellipsis = 1ull<<5,
  145. OdinDocEntityFlag_Param_CVararg = 1ull<<6,
  146. OdinDocEntityFlag_Param_NoAlias = 1ull<<7,
  147. OdinDocEntityFlag_Param_AnyInt = 1ull<<8,
  148. OdinDocEntityFlag_Type_Alias = 1ull<<20,
  149. OdinDocEntityFlag_Builtin_Pkg_Builtin = 1ull<<30,
  150. OdinDocEntityFlag_Builtin_Pkg_Intrinsics = 1ull<<31,
  151. OdinDocEntityFlag_Var_Thread_Local = 1ull<<40,
  152. OdinDocEntityFlag_Var_Static = 1ull<<41,
  153. OdinDocEntityFlag_Private = 1ull<<50,
  154. };
  155. struct OdinDocEntity {
  156. OdinDocEntityKind kind;
  157. u32 reserved;
  158. u64 flags;
  159. OdinDocPosition pos;
  160. OdinDocString name;
  161. OdinDocTypeIndex type;
  162. OdinDocString init_string;
  163. u32 reserved_for_init;
  164. OdinDocString comment; // line comment
  165. OdinDocString docs; // preceding comment
  166. i32 field_group_index;
  167. OdinDocEntityIndex foreign_library;
  168. OdinDocString link_name;
  169. OdinDocArray<OdinDocAttribute> attributes;
  170. OdinDocArray<OdinDocEntityIndex> grouped_entities; // Procedure Groups
  171. OdinDocArray<OdinDocString> where_clauses; // Procedures
  172. };
  173. enum OdinDocPkgFlags : u32 {
  174. OdinDocPkgFlag_Builtin = 1<<0,
  175. OdinDocPkgFlag_Runtime = 1<<1,
  176. OdinDocPkgFlag_Init = 1<<2,
  177. };
  178. struct OdinDocScopeEntry {
  179. OdinDocString name;
  180. OdinDocEntityIndex entity;
  181. };
  182. struct OdinDocPkg {
  183. OdinDocString fullpath;
  184. OdinDocString name;
  185. u32 flags;
  186. OdinDocString docs;
  187. OdinDocArray<OdinDocFileIndex> files;
  188. OdinDocArray<OdinDocScopeEntry> entries;
  189. };
  190. struct OdinDocHeader {
  191. OdinDocHeaderBase base;
  192. OdinDocArray<OdinDocFile> files;
  193. OdinDocArray<OdinDocPkg> pkgs;
  194. OdinDocArray<OdinDocEntity> entities;
  195. OdinDocArray<OdinDocType> types;
  196. };