pub struct AstNode<T> { /* private fields */ }
Implementations§
Source§impl<T> AstNode<T>
impl<T> AstNode<T>
pub fn new(node: T, loc: SourceRange) -> AstNode<T>
pub fn into_parts(self) -> (T, SourceRange)
Sourcepub fn start(&self) -> SourceLocation
pub fn start(&self) -> SourceLocation
Examples found in repository?
examples/dumps_ast.rs (line 194)
187 fn format_output<T>(&self, ast: &AstNode<T>, depth: usize) {
188 let spacing: String = std::iter::repeat(' ').take(depth).collect();
189
190 println!(
191 "{} {} -- '{}'::{},{}",
192 spacing,
193 std::any::type_name::<T>().split("::").last().unwrap(),
194 &self.source.to_string()[ast.start().col()..ast.end().col()],
195 ast.start().col(),
196 ast.end().col()
197 );
198 }
Sourcepub fn end(&self) -> SourceLocation
pub fn end(&self) -> SourceLocation
Examples found in repository?
examples/dumps_ast.rs (line 194)
187 fn format_output<T>(&self, ast: &AstNode<T>, depth: usize) {
188 let spacing: String = std::iter::repeat(' ').take(depth).collect();
189
190 println!(
191 "{} {} -- '{}'::{},{}",
192 spacing,
193 std::any::type_name::<T>().split("::").last().unwrap(),
194 &self.source.to_string()[ast.start().col()..ast.end().col()],
195 ast.start().col(),
196 ast.end().col()
197 );
198 }
Sourcepub fn range(&self) -> SourceRange
pub fn range(&self) -> SourceRange
Examples found in repository?
examples/explain.rs (line 111)
103 fn dump_expr_node(&self, node: &AstNode<Expr>) -> Box<RangeNode> {
104 match node.node() {
105 Expr::Unary(nxt) => self.dump_or_node(nxt),
106 Expr::Ternary {
107 condition,
108 true_clause,
109 false_clause,
110 } => Box::new(RangeNode::with_children(
111 node.range(),
112 [
113 self.dump_or_node(condition),
114 self.dump_or_node(true_clause),
115 self.dump_expr_node(false_clause),
116 ]
117 .into_iter(),
118 )),
119 }
120 }
121
122 fn dump_or_node(&self, node: &AstNode<ConditionalOr>) -> Box<RangeNode> {
123 match node.node() {
124 ConditionalOr::Unary(nxt) => self.dump_and_node(nxt),
125 ConditionalOr::Binary { lhs, rhs } => Box::new(RangeNode::with_children(
126 node.range(),
127 [self.dump_or_node(lhs), self.dump_and_node(rhs)].into_iter(),
128 )),
129 }
130 }
131
132 fn dump_and_node(&self, node: &AstNode<ConditionalAnd>) -> Box<RangeNode> {
133 match node.node() {
134 ConditionalAnd::Unary(nxt) => self.dump_relation(nxt),
135 ConditionalAnd::Binary { lhs, rhs } => Box::new(RangeNode::with_children(
136 node.range(),
137 [self.dump_and_node(lhs), self.dump_relation(rhs)].into_iter(),
138 )),
139 }
140 }
141
142 fn dump_relation(&self, node: &AstNode<Relation>) -> Box<RangeNode> {
143 match node.node() {
144 Relation::Unary(nxt) => self.dump_addition(nxt),
145 Relation::Binary { lhs, op: _op, rhs } => Box::new(RangeNode::with_children(
146 node.range(),
147 [self.dump_relation(lhs), self.dump_addition(rhs)].into_iter(),
148 )),
149 }
150 }
151
152 fn dump_addition(&self, node: &AstNode<Addition>) -> Box<RangeNode> {
153 match node.node() {
154 Addition::Unary(nxt) => self.dump_multiplication(nxt),
155 Addition::Binary { lhs, op: _op, rhs } => Box::new(RangeNode::with_children(
156 node.range(),
157 [self.dump_addition(lhs), self.dump_multiplication(rhs)].into_iter(),
158 )),
159 }
160 }
161
162 fn dump_multiplication(&self, node: &AstNode<Multiplication>) -> Box<RangeNode> {
163 match node.node() {
164 Multiplication::Unary(nxt) => self.dump_uniary(nxt),
165 Multiplication::Binary { lhs, op: _op, rhs } => Box::new(RangeNode::with_children(
166 node.range(),
167 [self.dump_multiplication(lhs), self.dump_uniary(rhs)].into_iter(),
168 )),
169 }
170 }
171
172 fn dump_uniary(&self, node: &AstNode<Unary>) -> Box<RangeNode> {
173 match node.node() {
174 Unary::Member(nxt) => self.dump_member(nxt),
175 Unary::NegMember { negs, member } => {
176 self.dump_neg(negs);
177 let mem = self.dump_member(member);
178 Box::new(RangeNode::with_children(node.range(), [mem].into_iter()))
179 }
180 Unary::NotMember { nots, member } => {
181 self.dump_not(nots);
182 let mem = self.dump_member(member);
183 Box::new(RangeNode::with_children(node.range(), [mem].into_iter()))
184 }
185 }
186 }
187
188 fn dump_neg(&self, node: &AstNode<NegList>) {
189 match node.node() {
190 NegList::List { tail } => self.dump_neg(tail),
191 NegList::EmptyList => {}
192 }
193 }
194
195 fn dump_not(&self, node: &AstNode<NotList>) {
196 match node.node() {
197 NotList::List { tail } => self.dump_not(tail),
198 NotList::EmptyList => {}
199 }
200 }
201
202 fn dump_member(&self, node: &AstNode<Member>) -> Box<RangeNode> {
203 let mut children = vec![self.dump_primary(&node.node().primary)];
204 for member in node.node().member.iter() {
205 children.push(self.dump_member_prime(member));
206 }
207
208 Box::new(RangeNode::with_children(node.range(), children.into_iter()))
209 }
210
211 fn dump_primary(&self, node: &AstNode<Primary>) -> Box<RangeNode> {
212 match node.node() {
213 Primary::Type => Box::new(RangeNode::empty(node.range())),
214 Primary::Ident(_) => Box::new(RangeNode::empty(node.range())),
215 Primary::Parens(expr) => Box::new(RangeNode::with_children(
216 node.range(),
217 [self.dump_expr_node(expr)].into_iter(),
218 )),
219 Primary::ListConstruction(exprs) => self.dump_expr_list(exprs),
220 Primary::ObjectInit(objinits) => self.dump_obj_inits(objinits),
221 Primary::Literal(_) => Box::new(RangeNode::empty(node.range())),
222 }
223 }
224
225 fn dump_member_prime(&self, node: &AstNode<MemberPrime>) -> Box<RangeNode> {
226 match node.node() {
227 MemberPrime::MemberAccess { ident } => self.dump_ident(&ident),
228 MemberPrime::Call { call } => self.dump_expr_list(call),
229 MemberPrime::ArrayAccess { access } => self.dump_expr_node(access),
230 MemberPrime::Empty => Box::new(RangeNode::empty(node.range())),
231 }
232 }
233
234 fn dump_ident(&self, node: &AstNode<Ident>) -> Box<RangeNode> {
235 Box::new(RangeNode::empty(node.range()))
236 }
237
238 fn dump_expr_list(&self, node: &AstNode<ExprList>) -> Box<RangeNode> {
239 Box::new(RangeNode::with_children(
240 node.range(),
241 node.node()
242 .exprs
243 .clone()
244 .into_iter()
245 .map(|x| self.dump_expr_node(&x)),
246 ))
247 }
248
249 fn dump_obj_inits(&self, node: &AstNode<ObjInits>) -> Box<RangeNode> {
250 Box::new(RangeNode::with_children(
251 node.range(),
252 node.node()
253 .inits
254 .clone()
255 .into_iter()
256 .map(|x| self.dump_obj_init(&x)),
257 ))
258 }
259
260 fn dump_obj_init(&self, node: &AstNode<ObjInit>) -> Box<RangeNode> {
261 self.dump_expr_node(&node.node().key);
262 self.dump_expr_node(&node.node().value);
263 Box::new(RangeNode::empty(node.range()))
264 }
Sourcepub fn node(&self) -> &T
pub fn node(&self) -> &T
Examples found in repository?
examples/dumps_ast.rs (line 31)
29 fn dump_expr_node(&self, node: &AstNode<Expr>, depth: usize) {
30 self.format_output(node, depth);
31 match node.node() {
32 Expr::Unary(nxt) => self.dump_or_node(nxt, depth + 1),
33 Expr::Ternary {
34 condition,
35 true_clause,
36 false_clause,
37 } => {
38 self.dump_or_node(condition, depth + 1);
39 self.dump_or_node(true_clause, depth + 1);
40 self.dump_expr_node(false_clause, depth + 1);
41 }
42 }
43 }
44
45 fn dump_or_node(&self, node: &AstNode<ConditionalOr>, depth: usize) {
46 self.format_output(node, depth);
47 match node.node() {
48 ConditionalOr::Unary(nxt) => self.dump_and_node(nxt, depth + 1),
49 ConditionalOr::Binary { lhs, rhs } => {
50 self.dump_or_node(lhs, depth + 1);
51 self.dump_and_node(rhs, depth + 1)
52 }
53 }
54 }
55
56 fn dump_and_node(&self, node: &AstNode<ConditionalAnd>, depth: usize) {
57 self.format_output(node, depth);
58 match node.node() {
59 ConditionalAnd::Unary(nxt) => self.dump_relation(nxt, depth + 1),
60 ConditionalAnd::Binary { lhs, rhs } => {
61 self.dump_and_node(lhs, depth + 1);
62 self.dump_relation(rhs, depth + 1);
63 }
64 }
65 }
66
67 fn dump_relation(&self, node: &AstNode<Relation>, depth: usize) {
68 self.format_output(node, depth);
69 match node.node() {
70 Relation::Unary(nxt) => self.dump_addition(nxt, depth + 1),
71 Relation::Binary { lhs, op: _op, rhs } => {
72 self.dump_relation(lhs, depth + 1);
73 self.dump_addition(rhs, depth + 1);
74 }
75 }
76 }
77
78 fn dump_addition(&self, node: &AstNode<Addition>, depth: usize) {
79 self.format_output(node, depth);
80 match node.node() {
81 Addition::Unary(nxt) => self.dump_multiplication(nxt, depth + 1),
82 Addition::Binary { lhs, op: _op, rhs } => {
83 self.dump_addition(lhs, depth + 1);
84 self.dump_multiplication(rhs, depth + 1);
85 }
86 }
87 }
88
89 fn dump_multiplication(&self, node: &AstNode<Multiplication>, depth: usize) {
90 self.format_output(node, depth);
91 match node.node() {
92 Multiplication::Unary(nxt) => self.dump_uniary(nxt, depth + 1),
93 Multiplication::Binary { lhs, op: _op, rhs } => {
94 self.dump_multiplication(lhs, depth + 1);
95 self.dump_uniary(rhs, depth + 1);
96 }
97 }
98 }
99
100 fn dump_uniary(&self, node: &AstNode<Unary>, depth: usize) {
101 self.format_output(node, depth);
102 match node.node() {
103 Unary::Member(nxt) => self.dump_member(nxt, depth + 1),
104 Unary::NegMember { negs, member } => {
105 self.dump_neg(negs, depth + 1);
106 self.dump_member(member, depth + 1);
107 }
108 Unary::NotMember { nots, member } => {
109 self.dump_not(nots, depth + 1);
110 self.dump_member(member, depth + 1);
111 }
112 }
113 }
114
115 fn dump_neg(&self, node: &AstNode<NegList>, depth: usize) {
116 self.format_output(node, depth);
117 match node.node() {
118 NegList::List { tail } => self.dump_neg(tail, depth + 1),
119 NegList::EmptyList => {}
120 }
121 }
122
123 fn dump_not(&self, node: &AstNode<NotList>, depth: usize) {
124 self.format_output(node, depth);
125 match node.node() {
126 NotList::List { tail } => self.dump_not(tail, depth + 1),
127 NotList::EmptyList => {}
128 }
129 }
130
131 fn dump_member(&self, node: &AstNode<Member>, depth: usize) {
132 self.format_output(node, depth);
133 self.dump_primary(&node.node().primary, depth + 1);
134 for member in node.node().member.iter() {
135 self.dump_member_prime(member, depth + 1);
136 }
137 }
138
139 fn dump_primary(&self, node: &AstNode<Primary>, depth: usize) {
140 self.format_output(node, depth);
141 match node.node() {
142 Primary::Type => {}
143 Primary::Ident(_) => {}
144 Primary::Parens(expr) => self.dump_expr_node(expr, depth + 1),
145 Primary::ListConstruction(exprs) => self.dump_expr_list(exprs, depth + 1),
146 Primary::ObjectInit(objinits) => self.dump_obj_inits(objinits, depth + 1),
147 Primary::Literal(_) => {}
148 }
149 }
150
151 fn dump_member_prime(&self, node: &AstNode<MemberPrime>, depth: usize) {
152 self.format_output(node, depth);
153 match node.node() {
154 MemberPrime::MemberAccess { ident } => {
155 self.dump_ident(&ident, depth + 1);
156 }
157 MemberPrime::Call { call } => self.dump_expr_list(call, depth + 1),
158 MemberPrime::ArrayAccess { access } => self.dump_expr_node(access, depth + 1),
159 MemberPrime::Empty => {}
160 }
161 }
162
163 fn dump_ident(&self, node: &AstNode<Ident>, depth: usize) {
164 self.format_output(node, depth);
165 }
166
167 fn dump_expr_list(&self, node: &AstNode<ExprList>, depth: usize) {
168 self.format_output(node, depth);
169 for expr in node.node().exprs.iter() {
170 self.dump_expr_node(expr, depth + 1);
171 }
172 }
173
174 fn dump_obj_inits(&self, node: &AstNode<ObjInits>, depth: usize) {
175 self.format_output(node, depth);
176 for init in node.node().inits.iter() {
177 self.dump_obj_init(init, depth + 1);
178 }
179 }
180
181 fn dump_obj_init(&self, node: &AstNode<ObjInit>, depth: usize) {
182 self.format_output(node, depth);
183 self.dump_expr_node(&node.node().key, depth + 1);
184 self.dump_expr_node(&node.node().value, depth + 1);
185 }
More examples
examples/explain.rs (line 104)
103 fn dump_expr_node(&self, node: &AstNode<Expr>) -> Box<RangeNode> {
104 match node.node() {
105 Expr::Unary(nxt) => self.dump_or_node(nxt),
106 Expr::Ternary {
107 condition,
108 true_clause,
109 false_clause,
110 } => Box::new(RangeNode::with_children(
111 node.range(),
112 [
113 self.dump_or_node(condition),
114 self.dump_or_node(true_clause),
115 self.dump_expr_node(false_clause),
116 ]
117 .into_iter(),
118 )),
119 }
120 }
121
122 fn dump_or_node(&self, node: &AstNode<ConditionalOr>) -> Box<RangeNode> {
123 match node.node() {
124 ConditionalOr::Unary(nxt) => self.dump_and_node(nxt),
125 ConditionalOr::Binary { lhs, rhs } => Box::new(RangeNode::with_children(
126 node.range(),
127 [self.dump_or_node(lhs), self.dump_and_node(rhs)].into_iter(),
128 )),
129 }
130 }
131
132 fn dump_and_node(&self, node: &AstNode<ConditionalAnd>) -> Box<RangeNode> {
133 match node.node() {
134 ConditionalAnd::Unary(nxt) => self.dump_relation(nxt),
135 ConditionalAnd::Binary { lhs, rhs } => Box::new(RangeNode::with_children(
136 node.range(),
137 [self.dump_and_node(lhs), self.dump_relation(rhs)].into_iter(),
138 )),
139 }
140 }
141
142 fn dump_relation(&self, node: &AstNode<Relation>) -> Box<RangeNode> {
143 match node.node() {
144 Relation::Unary(nxt) => self.dump_addition(nxt),
145 Relation::Binary { lhs, op: _op, rhs } => Box::new(RangeNode::with_children(
146 node.range(),
147 [self.dump_relation(lhs), self.dump_addition(rhs)].into_iter(),
148 )),
149 }
150 }
151
152 fn dump_addition(&self, node: &AstNode<Addition>) -> Box<RangeNode> {
153 match node.node() {
154 Addition::Unary(nxt) => self.dump_multiplication(nxt),
155 Addition::Binary { lhs, op: _op, rhs } => Box::new(RangeNode::with_children(
156 node.range(),
157 [self.dump_addition(lhs), self.dump_multiplication(rhs)].into_iter(),
158 )),
159 }
160 }
161
162 fn dump_multiplication(&self, node: &AstNode<Multiplication>) -> Box<RangeNode> {
163 match node.node() {
164 Multiplication::Unary(nxt) => self.dump_uniary(nxt),
165 Multiplication::Binary { lhs, op: _op, rhs } => Box::new(RangeNode::with_children(
166 node.range(),
167 [self.dump_multiplication(lhs), self.dump_uniary(rhs)].into_iter(),
168 )),
169 }
170 }
171
172 fn dump_uniary(&self, node: &AstNode<Unary>) -> Box<RangeNode> {
173 match node.node() {
174 Unary::Member(nxt) => self.dump_member(nxt),
175 Unary::NegMember { negs, member } => {
176 self.dump_neg(negs);
177 let mem = self.dump_member(member);
178 Box::new(RangeNode::with_children(node.range(), [mem].into_iter()))
179 }
180 Unary::NotMember { nots, member } => {
181 self.dump_not(nots);
182 let mem = self.dump_member(member);
183 Box::new(RangeNode::with_children(node.range(), [mem].into_iter()))
184 }
185 }
186 }
187
188 fn dump_neg(&self, node: &AstNode<NegList>) {
189 match node.node() {
190 NegList::List { tail } => self.dump_neg(tail),
191 NegList::EmptyList => {}
192 }
193 }
194
195 fn dump_not(&self, node: &AstNode<NotList>) {
196 match node.node() {
197 NotList::List { tail } => self.dump_not(tail),
198 NotList::EmptyList => {}
199 }
200 }
201
202 fn dump_member(&self, node: &AstNode<Member>) -> Box<RangeNode> {
203 let mut children = vec![self.dump_primary(&node.node().primary)];
204 for member in node.node().member.iter() {
205 children.push(self.dump_member_prime(member));
206 }
207
208 Box::new(RangeNode::with_children(node.range(), children.into_iter()))
209 }
210
211 fn dump_primary(&self, node: &AstNode<Primary>) -> Box<RangeNode> {
212 match node.node() {
213 Primary::Type => Box::new(RangeNode::empty(node.range())),
214 Primary::Ident(_) => Box::new(RangeNode::empty(node.range())),
215 Primary::Parens(expr) => Box::new(RangeNode::with_children(
216 node.range(),
217 [self.dump_expr_node(expr)].into_iter(),
218 )),
219 Primary::ListConstruction(exprs) => self.dump_expr_list(exprs),
220 Primary::ObjectInit(objinits) => self.dump_obj_inits(objinits),
221 Primary::Literal(_) => Box::new(RangeNode::empty(node.range())),
222 }
223 }
224
225 fn dump_member_prime(&self, node: &AstNode<MemberPrime>) -> Box<RangeNode> {
226 match node.node() {
227 MemberPrime::MemberAccess { ident } => self.dump_ident(&ident),
228 MemberPrime::Call { call } => self.dump_expr_list(call),
229 MemberPrime::ArrayAccess { access } => self.dump_expr_node(access),
230 MemberPrime::Empty => Box::new(RangeNode::empty(node.range())),
231 }
232 }
233
234 fn dump_ident(&self, node: &AstNode<Ident>) -> Box<RangeNode> {
235 Box::new(RangeNode::empty(node.range()))
236 }
237
238 fn dump_expr_list(&self, node: &AstNode<ExprList>) -> Box<RangeNode> {
239 Box::new(RangeNode::with_children(
240 node.range(),
241 node.node()
242 .exprs
243 .clone()
244 .into_iter()
245 .map(|x| self.dump_expr_node(&x)),
246 ))
247 }
248
249 fn dump_obj_inits(&self, node: &AstNode<ObjInits>) -> Box<RangeNode> {
250 Box::new(RangeNode::with_children(
251 node.range(),
252 node.node()
253 .inits
254 .clone()
255 .into_iter()
256 .map(|x| self.dump_obj_init(&x)),
257 ))
258 }
259
260 fn dump_obj_init(&self, node: &AstNode<ObjInit>) -> Box<RangeNode> {
261 self.dump_expr_node(&node.node().key);
262 self.dump_expr_node(&node.node().value);
263 Box::new(RangeNode::empty(node.range()))
264 }
Trait Implementations§
Source§impl<'de, T> Deserialize<'de> for AstNode<T>where
T: Deserialize<'de>,
impl<'de, T> Deserialize<'de> for AstNode<T>where
T: Deserialize<'de>,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
impl<T> StructuralPartialEq for AstNode<T>
Auto Trait Implementations§
impl<T> Freeze for AstNode<T>where
T: Freeze,
impl<T> RefUnwindSafe for AstNode<T>where
T: RefUnwindSafe,
impl<T> Send for AstNode<T>where
T: Send,
impl<T> Sync for AstNode<T>where
T: Sync,
impl<T> Unpin for AstNode<T>where
T: Unpin,
impl<T> UnwindSafe for AstNode<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more