ast.odin 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  1. package odin_ast
  2. import "core:odin/tokenizer"
  3. Proc_Tag :: enum {
  4. Bounds_Check,
  5. No_Bounds_Check,
  6. }
  7. Proc_Tags :: distinct bit_set[Proc_Tag; u32];
  8. Proc_Inlining :: enum u32 {
  9. None = 0,
  10. Inline = 1,
  11. No_Inline = 2,
  12. }
  13. Proc_Calling_Convention :: enum i32 {
  14. Invalid = 0,
  15. Odin,
  16. Contextless,
  17. C_Decl,
  18. Std_Call,
  19. Fast_Call,
  20. Foreign_Block_Default = -1,
  21. }
  22. Node_State_Flag :: enum {
  23. Bounds_Check,
  24. No_Bounds_Check,
  25. }
  26. Node_State_Flags :: distinct bit_set[Node_State_Flag];
  27. Comment_Group :: struct {
  28. list: []tokenizer.Token,
  29. }
  30. Node :: struct {
  31. pos: tokenizer.Pos,
  32. end: tokenizer.Pos,
  33. derived: any,
  34. state_flags: Node_State_Flags,
  35. }
  36. Expr :: struct {
  37. using expr_base: Node,
  38. }
  39. Stmt :: struct {
  40. using stmt_base: Node,
  41. }
  42. Decl :: struct {
  43. using decl_base: Stmt,
  44. }
  45. // Expressions
  46. Bad_Expr :: struct {
  47. using node: Expr,
  48. }
  49. Ident :: struct {
  50. using node: Expr,
  51. name: string,
  52. }
  53. Implicit :: struct {
  54. using node: Expr,
  55. tok: tokenizer.Token,
  56. }
  57. Undef :: struct {
  58. using node: Expr,
  59. tok: tokenizer.Token_Kind,
  60. }
  61. Basic_Lit :: struct {
  62. using node: Expr,
  63. tok: tokenizer.Token,
  64. }
  65. Basic_Directive :: struct {
  66. using node: Expr,
  67. tok: tokenizer.Token,
  68. name: string,
  69. }
  70. Ellipsis :: struct {
  71. using node: Expr,
  72. tok: tokenizer.Token_Kind,
  73. expr: ^Expr,
  74. }
  75. Proc_Lit :: struct {
  76. using node: Expr,
  77. type: ^Proc_Type,
  78. body: ^Stmt,
  79. tags: Proc_Tags,
  80. inlining: Proc_Inlining,
  81. where_token: tokenizer.Token,
  82. where_clauses: []^Expr,
  83. }
  84. Comp_Lit :: struct {
  85. using node: Expr,
  86. type: ^Expr,
  87. open: tokenizer.Pos,
  88. elems: []^Expr,
  89. close: tokenizer.Pos,
  90. }
  91. Tag_Expr :: struct {
  92. using node: Expr,
  93. op: tokenizer.Token,
  94. name: string,
  95. expr: ^Expr,
  96. }
  97. Unary_Expr :: struct {
  98. using node: Expr,
  99. op: tokenizer.Token,
  100. expr: ^Expr,
  101. }
  102. Binary_Expr :: struct {
  103. using node: Expr,
  104. left: ^Expr,
  105. op: tokenizer.Token,
  106. right: ^Expr,
  107. }
  108. Paren_Expr :: struct {
  109. using node: Expr,
  110. open: tokenizer.Pos,
  111. expr: ^Expr,
  112. close: tokenizer.Pos,
  113. }
  114. Selector_Expr :: struct {
  115. using node: Expr,
  116. expr: ^Expr,
  117. field: ^Ident,
  118. }
  119. Implicit_Selector_Expr :: struct {
  120. using node: Expr,
  121. field: ^Ident,
  122. }
  123. Index_Expr :: struct {
  124. using node: Expr,
  125. expr: ^Expr,
  126. open: tokenizer.Pos,
  127. index: ^Expr,
  128. close: tokenizer.Pos,
  129. }
  130. Deref_Expr :: struct {
  131. using node: Expr,
  132. expr: ^Expr,
  133. op: tokenizer.Token,
  134. }
  135. Slice_Expr :: struct {
  136. using node: Expr,
  137. expr: ^Expr,
  138. open: tokenizer.Pos,
  139. low: ^Expr,
  140. interval: tokenizer.Token,
  141. high: ^Expr,
  142. close: tokenizer.Pos,
  143. }
  144. Call_Expr :: struct {
  145. using node: Expr,
  146. inlining: Proc_Inlining,
  147. expr: ^Expr,
  148. open: tokenizer.Pos,
  149. args: []^Expr,
  150. ellipsis: tokenizer.Token,
  151. close: tokenizer.Pos,
  152. }
  153. Field_Value :: struct {
  154. using node: Expr,
  155. field: ^Expr,
  156. sep: tokenizer.Pos,
  157. value: ^Expr,
  158. }
  159. Ternary_Expr :: struct {
  160. using node: Expr,
  161. cond: ^Expr,
  162. op1: tokenizer.Token,
  163. x: ^Expr,
  164. op2: tokenizer.Token,
  165. y: ^Expr,
  166. }
  167. Type_Assertion :: struct {
  168. using node: Expr,
  169. expr: ^Expr,
  170. dot: tokenizer.Pos,
  171. open: tokenizer.Pos,
  172. type: ^Expr,
  173. close: tokenizer.Pos,
  174. }
  175. Type_Cast :: struct {
  176. using node: Expr,
  177. tok: tokenizer.Token,
  178. open: tokenizer.Pos,
  179. type: ^Expr,
  180. close: tokenizer.Pos,
  181. expr: ^Expr,
  182. }
  183. Auto_Cast :: struct {
  184. using node: Expr,
  185. op: tokenizer.Token,
  186. expr: ^Expr,
  187. }
  188. // Statements
  189. Bad_Stmt :: struct {
  190. using node: Stmt,
  191. }
  192. Empty_Stmt :: struct {
  193. using node: Stmt,
  194. semicolon: tokenizer.Pos, // Position of the following ';'
  195. }
  196. Expr_Stmt :: struct {
  197. using node: Stmt,
  198. expr: ^Expr,
  199. }
  200. Tag_Stmt :: struct {
  201. using node: Stmt,
  202. op: tokenizer.Token,
  203. name: string,
  204. stmt: ^Stmt,
  205. }
  206. Assign_Stmt :: struct {
  207. using node: Stmt,
  208. lhs: []^Expr,
  209. op: tokenizer.Token,
  210. rhs: []^Expr,
  211. }
  212. Block_Stmt :: struct {
  213. using node: Stmt,
  214. label: ^Expr,
  215. open: tokenizer.Pos,
  216. stmts: []^Stmt,
  217. close: tokenizer.Pos,
  218. }
  219. If_Stmt :: struct {
  220. using node: Stmt,
  221. label: ^Expr,
  222. if_pos: tokenizer.Pos,
  223. init: ^Stmt,
  224. cond: ^Expr,
  225. body: ^Stmt,
  226. else_stmt: ^Stmt,
  227. }
  228. When_Stmt :: struct {
  229. using node: Stmt,
  230. when_pos: tokenizer.Pos,
  231. cond: ^Expr,
  232. body: ^Stmt,
  233. else_stmt: ^Stmt,
  234. }
  235. Return_Stmt :: struct {
  236. using node: Stmt,
  237. results: []^Expr,
  238. }
  239. Defer_Stmt :: struct {
  240. using node: Stmt,
  241. stmt: ^Stmt,
  242. }
  243. For_Stmt :: struct {
  244. using node: Stmt,
  245. label: ^Expr,
  246. for_pos: tokenizer.Pos,
  247. init: ^Stmt,
  248. cond: ^Expr,
  249. post: ^Stmt,
  250. body: ^Stmt,
  251. }
  252. Range_Stmt :: struct {
  253. using node: Stmt,
  254. label: ^Expr,
  255. for_pos: tokenizer.Pos,
  256. val0: ^Expr,
  257. val1: ^Expr,
  258. in_pos: tokenizer.Pos,
  259. expr: ^Expr,
  260. body: ^Stmt,
  261. }
  262. Case_Clause :: struct {
  263. using node: Stmt,
  264. case_pos: tokenizer.Pos,
  265. list: []^Expr,
  266. terminator: tokenizer.Token,
  267. body: []^Stmt,
  268. }
  269. Switch_Stmt :: struct {
  270. using node: Stmt,
  271. label: ^Expr,
  272. switch_pos: tokenizer.Pos,
  273. init: ^Stmt,
  274. cond: ^Expr,
  275. body: ^Stmt,
  276. complete: bool,
  277. }
  278. Type_Switch_Stmt :: struct {
  279. using node: Stmt,
  280. label: ^Expr,
  281. switch_pos: tokenizer.Pos,
  282. tag: ^Stmt,
  283. expr: ^Expr,
  284. body: ^Stmt,
  285. complete: bool,
  286. }
  287. Branch_Stmt :: struct {
  288. using node: Stmt,
  289. tok: tokenizer.Token,
  290. label: ^Ident,
  291. }
  292. Using_Stmt :: struct {
  293. using node: Stmt,
  294. list: []^Expr,
  295. }
  296. // Declarations
  297. Bad_Decl :: struct {
  298. using node: Decl,
  299. }
  300. Value_Decl :: struct {
  301. using node: Decl,
  302. docs: ^Comment_Group,
  303. attributes: [dynamic]^Attribute, // dynamic as parsing will add to them lazily
  304. names: []^Expr,
  305. type: ^Expr,
  306. values: []^Expr,
  307. comment: ^Comment_Group,
  308. is_using: bool,
  309. is_mutable: bool,
  310. }
  311. Package_Decl :: struct {
  312. using node: Decl,
  313. docs: ^Comment_Group,
  314. token: tokenizer.Token,
  315. name: string,
  316. comment: ^Comment_Group,
  317. }
  318. Import_Decl :: struct {
  319. using node: Decl,
  320. docs: ^Comment_Group,
  321. is_using: bool,
  322. import_tok: tokenizer.Token,
  323. name: tokenizer.Token,
  324. relpath: tokenizer.Token,
  325. fullpath: string,
  326. comment: ^Comment_Group,
  327. }
  328. Foreign_Block_Decl :: struct {
  329. using node: Decl,
  330. docs: ^Comment_Group,
  331. attributes: [dynamic]^Attribute, // dynamic as parsing will add to them lazily
  332. tok: tokenizer.Token,
  333. foreign_library: ^Expr,
  334. body: ^Stmt,
  335. }
  336. Foreign_Import_Decl :: struct {
  337. using node: Decl,
  338. docs: ^Comment_Group,
  339. foreign_tok: tokenizer.Token,
  340. import_tok: tokenizer.Token,
  341. name: ^Ident,
  342. collection_name: string,
  343. fullpaths: []string,
  344. attributes: [dynamic]^Attribute, // dynamic as parsing will add to them lazily
  345. comment: ^Comment_Group,
  346. }
  347. // Other things
  348. unparen_expr :: proc(expr: ^Expr) -> (val: ^Expr) {
  349. val = expr;
  350. if expr == nil {
  351. return;
  352. }
  353. for {
  354. e, ok := val.derived.(Paren_Expr);
  355. if !ok do break;
  356. val = e.expr;
  357. }
  358. return;
  359. }
  360. Field_Flag :: enum {
  361. Ellipsis,
  362. Using,
  363. No_Alias,
  364. C_Vararg,
  365. Auto_Cast,
  366. In,
  367. Results,
  368. Tags,
  369. Default_Parameters,
  370. Typeid_Token,
  371. }
  372. Field_Flags :: distinct bit_set[Field_Flag];
  373. Field_Flags_Struct :: Field_Flags{
  374. .Using,
  375. .Tags,
  376. };
  377. Field_Flags_Record_Poly_Params :: Field_Flags{
  378. .Typeid_Token,
  379. };
  380. Field_Flags_Signature :: Field_Flags{
  381. .Ellipsis,
  382. .Using,
  383. .No_Alias,
  384. .C_Vararg,
  385. .Auto_Cast,
  386. .Default_Parameters,
  387. };
  388. Field_Flags_Signature_Params :: Field_Flags_Signature | {Field_Flag.Typeid_Token};
  389. Field_Flags_Signature_Results :: Field_Flags_Signature;
  390. Proc_Group :: struct {
  391. using node: Expr,
  392. tok: tokenizer.Token,
  393. open: tokenizer.Pos,
  394. args: []^Expr,
  395. close: tokenizer.Pos,
  396. }
  397. Attribute :: struct {
  398. using node: Node,
  399. tok: tokenizer.Token_Kind,
  400. open: tokenizer.Pos,
  401. elems: []^Expr,
  402. close: tokenizer.Pos,
  403. }
  404. Field :: struct {
  405. using node: Node,
  406. docs: ^Comment_Group,
  407. names: []^Expr, // Could be polymorphic
  408. type: ^Expr,
  409. default_value: ^Expr,
  410. tag: tokenizer.Token,
  411. flags: Field_Flags,
  412. comment: ^Comment_Group,
  413. }
  414. Field_List :: struct {
  415. using node: Node,
  416. open: tokenizer.Pos,
  417. list: []^Field,
  418. close: tokenizer.Pos,
  419. }
  420. // Types
  421. Typeid_Type :: struct {
  422. using node: Expr,
  423. tok: tokenizer.Token_Kind,
  424. specialization: ^Expr,
  425. }
  426. Helper_Type :: struct {
  427. using node: Expr,
  428. tok: tokenizer.Token_Kind,
  429. type: ^Expr,
  430. }
  431. Distinct_Type :: struct {
  432. using node: Expr,
  433. tok: tokenizer.Token_Kind,
  434. type: ^Expr,
  435. }
  436. Opaque_Type :: struct {
  437. using node: Expr,
  438. tok: tokenizer.Token_Kind,
  439. type: ^Expr,
  440. }
  441. Poly_Type :: struct {
  442. using node: Expr,
  443. dollar: tokenizer.Pos,
  444. type: ^Ident,
  445. specialization: ^Expr,
  446. }
  447. Proc_Type :: struct {
  448. using node: Expr,
  449. tok: tokenizer.Token,
  450. calling_convention: Proc_Calling_Convention,
  451. params: ^Field_List,
  452. arrow: tokenizer.Pos,
  453. results: ^Field_List,
  454. tags: Proc_Tags,
  455. generic: bool,
  456. diverging: bool,
  457. }
  458. Pointer_Type :: struct {
  459. using node: Expr,
  460. pointer: tokenizer.Pos,
  461. elem: ^Expr,
  462. }
  463. Array_Type :: struct {
  464. using node: Expr,
  465. open: tokenizer.Pos,
  466. len: ^Expr, // Ellipsis node for [?]T arrray types, nil for slice types
  467. close: tokenizer.Pos,
  468. elem: ^Expr,
  469. }
  470. Dynamic_Array_Type :: struct {
  471. using node: Expr,
  472. open: tokenizer.Pos,
  473. dynamic_pos: tokenizer.Pos,
  474. close: tokenizer.Pos,
  475. elem: ^Expr,
  476. }
  477. Struct_Type :: struct {
  478. using node: Expr,
  479. tok_pos: tokenizer.Pos,
  480. poly_params: ^Field_List,
  481. align: ^Expr,
  482. fields: ^Field_List,
  483. name_count: int,
  484. where_token: tokenizer.Token,
  485. where_clauses: []^Expr,
  486. is_packed: bool,
  487. is_raw_union: bool,
  488. }
  489. Union_Type :: struct {
  490. using node: Expr,
  491. tok_pos: tokenizer.Pos,
  492. poly_params: ^Field_List,
  493. align: ^Expr,
  494. variants: []^Expr,
  495. where_token: tokenizer.Token,
  496. where_clauses: []^Expr,
  497. }
  498. Enum_Type :: struct {
  499. using node: Expr,
  500. tok_pos: tokenizer.Pos,
  501. base_type: ^Expr,
  502. open: tokenizer.Pos,
  503. fields: []^Expr,
  504. close: tokenizer.Pos,
  505. is_using: bool,
  506. }
  507. Bit_Field_Type :: struct {
  508. using node: Expr,
  509. tok_pos: tokenizer.Pos,
  510. align: ^Expr,
  511. open: tokenizer.Pos,
  512. fields: []^Field_Value, // Field_Value with ':' rather than '='
  513. close: tokenizer.Pos,
  514. }
  515. Bit_Set_Type :: struct {
  516. using node: Expr,
  517. tok_pos: tokenizer.Pos,
  518. open: tokenizer.Pos,
  519. elem: ^Expr,
  520. underlying: ^Expr,
  521. close: tokenizer.Pos,
  522. }
  523. Map_Type :: struct {
  524. using node: Expr,
  525. tok_pos: tokenizer.Pos,
  526. key: ^Expr,
  527. value: ^Expr,
  528. }