1mod expr;
2mod macros;
3mod unary;
4mod atomics;
5mod func;
6mod binary;
7mod bindings;
8mod call;
9mod field_access;
10mod path_access;
11mod parenthesized;
12mod statement;
13mod assignment;
14mod control_flow;
15mod range;
16mod map;
17mod module;
18
19use ecow::EcoString;
20use crate::node::SyntaxNode;
21use crate::span::{HasSpan, Span};
22
23pub use expr::*;
24use macros::*;
25pub use unary::*;
26pub use atomics::*;
27pub use binary::*;
28pub use bindings::*;
29pub use func::*;
30pub use call::*;
31pub use field_access::*;
32pub use path_access::*;
33pub use parenthesized::*;
34pub use statement::*;
35pub use assignment::*;
36pub use control_flow::*;
37pub use range::*;
38pub use map::*;
39pub use module::*;
40
41pub trait AstNode<'a>: Sized {
42 fn from_untyped(node: &'a SyntaxNode) -> Option<Self>;
43 fn to_untyped(&self) -> &'a SyntaxNode;
44 fn span(&self) -> Span {
45 self.to_untyped().span()
46 }
47
48 fn to_text(&self) -> EcoString {
49 self.to_untyped().to_text()
50 }
51
52 fn cast<T: AstNode<'a>>(&self) -> Option<T> {
53 self.to_untyped().cast()
54 }
55}
56
57impl<'a, T> HasSpan for T where T: AstNode<'a> {
58 fn span(&self) -> Span {
59 AstNode::span(self)
60 }
61}
62
63