thrift_analyzer/analyzer/
ast.rs1use std::{any::Any, fmt::Debug, ops::Deref, rc::Rc};
2
3use crate::analyzer::base::{Position, Range};
4
5pub trait Node: Debug + Any {
7 fn as_any(&self) -> &dyn Any;
9 fn range(&self) -> Range;
11 fn children(&self) -> Vec<&dyn Node>;
13}
14
15#[derive(Debug)]
17pub enum HeaderNode {
18 Include(IncludeNode),
19 CppInclude(CppIncludeNode),
20 Namespace(NamespaceNode),
21}
22
23impl Deref for HeaderNode {
24 type Target = dyn Node;
25
26 fn deref(&self) -> &Self::Target {
27 match self {
28 HeaderNode::Include(node) => node,
29 HeaderNode::CppInclude(node) => node,
30 HeaderNode::Namespace(node) => node,
31 }
32 }
33}
34
35#[derive(Debug)]
37pub enum DefinitionNode {
38 Const(ConstNode),
39 Typedef(TypedefNode),
40 Enum(EnumNode),
41 Struct(StructNode),
42 Union(UnionNode),
43 Exception(ExceptionNode),
44 Service(ServiceNode),
45}
46
47impl Deref for DefinitionNode {
48 type Target = dyn Node;
49
50 fn deref(&self) -> &Self::Target {
51 match self {
52 DefinitionNode::Const(node) => node,
53 DefinitionNode::Typedef(node) => node,
54 DefinitionNode::Enum(node) => node,
55 DefinitionNode::Struct(node) => node,
56 DefinitionNode::Union(node) => node,
57 DefinitionNode::Exception(node) => node,
58 DefinitionNode::Service(node) => node,
59 }
60 }
61}
62
63impl DefinitionNode {
64 pub fn name(&self) -> &str {
65 &self.identifier().name
66 }
67
68 pub fn identifier(&self) -> &IdentifierNode {
69 match self {
70 DefinitionNode::Const(node) => &node.identifier,
71 DefinitionNode::Typedef(node) => &node.identifier,
72 DefinitionNode::Enum(node) => &node.identifier,
73 DefinitionNode::Struct(node) => &node.identifier,
74 DefinitionNode::Union(node) => &node.identifier,
75 DefinitionNode::Exception(node) => &node.identifier,
76 DefinitionNode::Service(node) => &node.identifier,
77 }
78 }
79}
80
81#[derive(Debug)]
83pub enum FieldTypeNode {
84 Identifier(IdentifierNode),
85 BaseType(BaseTypeNode),
86 MapType(MapTypeNode),
87 SetType(SetTypeNode),
88 ListType(ListTypeNode),
89}
90
91impl Deref for FieldTypeNode {
92 type Target = dyn Node;
93
94 fn deref(&self) -> &Self::Target {
95 match self {
96 FieldTypeNode::Identifier(node) => node,
97 FieldTypeNode::BaseType(node) => node,
98 FieldTypeNode::MapType(node) => node,
99 FieldTypeNode::SetType(node) => node,
100 FieldTypeNode::ListType(node) => node,
101 }
102 }
103}
104
105#[derive(Debug)]
106pub struct DocumentNode {
107 pub range: Range,
108 pub headers: Vec<Rc<HeaderNode>>,
109 pub definitions: Vec<Rc<DefinitionNode>>,
110}
111
112#[derive(Debug)]
113pub struct IncludeNode {
114 pub range: Range,
115 pub literal: String,
116}
117
118#[derive(Debug)]
119pub struct CppIncludeNode {
120 pub range: Range,
121 pub literal: String,
122}
123
124#[derive(Debug)]
125pub struct NamespaceNode {
126 pub range: Range,
127 pub scope: String,
128 pub identifier: IdentifierNode,
129 pub ext: Option<ExtNode>,
130}
131
132#[derive(Debug, Clone)]
133pub struct IdentifierNode {
134 pub range: Range,
135 pub name: String,
136}
137
138impl IdentifierNode {
139 pub fn position_in_namespace(&self, pos: Position) -> bool {
141 let dot_index = match self.name.find('.') {
142 Some(index) => index,
143 None => return false,
144 };
145
146 self.range.contains(pos)
147 && pos.column >= self.range.start.column
148 && pos.column <= self.range.start.column + dot_index as u32
149 }
150
151 pub fn split_by_first_dot(&self) -> (Option<IdentifierNode>, IdentifierNode) {
153 let dot_index = match self.name.find('.') {
154 Some(index) => index,
155 None => return (None, self.clone()),
156 };
157
158 let namespace = IdentifierNode {
159 range: Range {
160 start: self.range.start,
161 end: Position {
162 line: self.range.start.line,
163 column: self.range.start.column + dot_index as u32,
164 },
165 },
166 name: self.name[..dot_index].to_string(),
167 };
168 let identifier = IdentifierNode {
169 range: Range {
170 start: Position {
171 line: self.range.start.line,
172 column: self.range.start.column + dot_index as u32,
173 },
174 end: self.range.end,
175 },
176 name: self.name[dot_index + 1..].to_string(),
177 };
178
179 (Some(namespace), identifier)
180 }
181}
182
183#[derive(Debug)]
184pub struct ConstNode {
185 pub range: Range,
186 pub field_type: FieldTypeNode,
187 pub identifier: IdentifierNode,
188 pub value: ConstValueNode,
189}
190
191#[derive(Debug)]
192pub struct BaseTypeNode {
193 pub range: Range,
194 pub name: String,
195}
196
197#[derive(Debug)]
198pub struct MapTypeNode {
199 pub range: Range,
200 pub cpp_type: Option<String>,
201 pub key_type: Box<FieldTypeNode>,
202 pub value_type: Box<FieldTypeNode>,
203}
204
205#[derive(Debug)]
206pub struct SetTypeNode {
207 pub range: Range,
208 pub cpp_type: Option<String>,
209 pub type_node: Box<FieldTypeNode>,
210}
211
212#[derive(Debug)]
213pub struct ListTypeNode {
214 pub range: Range,
215 pub cpp_type: Option<String>,
216 pub type_node: Box<FieldTypeNode>,
217}
218
219#[derive(Debug)]
220pub struct ConstValueNode {
221 pub range: Range,
222 pub value: String,
223}
224
225#[derive(Debug)]
226pub struct TypedefNode {
227 pub range: Range,
228 pub definition_type: FieldTypeNode, pub identifier: IdentifierNode,
230}
231
232#[derive(Debug)]
233pub struct EnumNode {
234 pub range: Range,
235 pub identifier: IdentifierNode,
236 pub values: Vec<EnumValueNode>,
237}
238
239#[derive(Debug)]
240pub struct EnumValueNode {
241 pub range: Range,
242 pub name: String,
243 pub value: Option<i32>,
244 pub ext: Option<ExtNode>,
245}
246
247#[derive(Debug)]
248pub struct StructNode {
249 pub range: Range,
250 pub identifier: IdentifierNode,
251 pub fields: Vec<FieldNode>,
252 pub ext: Option<ExtNode>,
253}
254
255#[derive(Debug)]
256pub struct FieldNode {
257 pub range: Range,
258 pub field_id: Option<FieldIdNode>,
259 pub field_req: Option<String>,
260 pub field_type: FieldTypeNode,
261 pub identifier: IdentifierNode,
262 pub default_value: Option<ConstValueNode>,
263 pub ext: Option<ExtNode>,
264}
265
266#[derive(Debug)]
267pub struct FieldIdNode {
268 pub range: Range,
269 pub id: i32,
270}
271
272#[derive(Debug)]
273pub struct UnionNode {
274 pub range: Range,
275 pub identifier: IdentifierNode,
276 pub fields: Vec<FieldNode>,
277}
278
279#[derive(Debug)]
280pub struct ExceptionNode {
281 pub range: Range,
282 pub identifier: IdentifierNode,
283 pub fields: Vec<FieldNode>,
284}
285
286#[derive(Debug)]
287pub struct ServiceNode {
288 pub range: Range,
289 pub identifier: IdentifierNode,
290 pub extends: Option<IdentifierNode>,
291 pub functions: Vec<FunctionNode>,
292}
293
294#[derive(Debug)]
295pub struct FunctionNode {
296 pub range: Range,
297 pub is_oneway: bool,
298 pub function_type: Option<FieldTypeNode>,
299 pub identifier: IdentifierNode,
300 pub fields: Vec<FieldNode>,
301 pub throws: Option<Vec<FieldNode>>,
302 pub ext: Option<ExtNode>,
303}
304
305#[derive(Debug)]
306pub struct ExtNode {
307 pub range: Range,
308 pub kv_pairs: Vec<(String, String)>,
309}
310
311impl Node for DocumentNode {
312 fn as_any(&self) -> &dyn Any {
313 self
314 }
315
316 fn range(&self) -> Range {
317 self.range.clone()
318 }
319
320 fn children(&self) -> Vec<&dyn Node> {
321 let mut children = Vec::new();
322 children.extend(self.headers.iter().map(|h| h.as_ref().deref()));
323 children.extend(self.definitions.iter().map(|d| d.as_ref().deref()));
324 children
325 }
326}
327
328impl Node for IncludeNode {
329 fn as_any(&self) -> &dyn Any {
330 self
331 }
332
333 fn range(&self) -> Range {
334 self.range.clone()
335 }
336
337 fn children(&self) -> Vec<&dyn Node> {
338 Vec::new()
339 }
340}
341
342impl Node for CppIncludeNode {
343 fn as_any(&self) -> &dyn Any {
344 self
345 }
346
347 fn range(&self) -> Range {
348 self.range.clone()
349 }
350
351 fn children(&self) -> Vec<&dyn Node> {
352 Vec::new()
353 }
354}
355
356impl Node for NamespaceNode {
357 fn as_any(&self) -> &dyn Any {
358 self
359 }
360
361 fn range(&self) -> Range {
362 self.range.clone()
363 }
364
365 fn children(&self) -> Vec<&dyn Node> {
366 let mut children = Vec::new();
367 children.push(&self.identifier as &dyn Node);
368 if let Some(ext) = &self.ext {
369 children.push(ext as &dyn Node);
370 }
371 children
372 }
373}
374
375impl Node for IdentifierNode {
376 fn as_any(&self) -> &dyn Any {
377 self
378 }
379
380 fn range(&self) -> Range {
381 self.range.clone()
382 }
383
384 fn children(&self) -> Vec<&dyn Node> {
385 Vec::new()
386 }
387}
388
389impl Node for ConstNode {
390 fn as_any(&self) -> &dyn Any {
391 self
392 }
393
394 fn range(&self) -> Range {
395 self.range.clone()
396 }
397
398 fn children(&self) -> Vec<&dyn Node> {
399 vec![
400 self.field_type.deref(),
401 &self.identifier as &dyn Node,
402 &self.value as &dyn Node,
403 ]
404 }
405}
406
407impl Node for BaseTypeNode {
408 fn as_any(&self) -> &dyn Any {
409 self
410 }
411
412 fn range(&self) -> Range {
413 self.range.clone()
414 }
415
416 fn children(&self) -> Vec<&dyn Node> {
417 Vec::new()
418 }
419}
420
421impl Node for MapTypeNode {
422 fn as_any(&self) -> &dyn Any {
423 self
424 }
425
426 fn range(&self) -> Range {
427 self.range.clone()
428 }
429
430 fn children(&self) -> Vec<&dyn Node> {
431 vec![
432 self.key_type.as_ref().deref(),
433 self.value_type.as_ref().deref(),
434 ]
435 }
436}
437
438impl Node for SetTypeNode {
439 fn as_any(&self) -> &dyn Any {
440 self
441 }
442
443 fn range(&self) -> Range {
444 self.range.clone()
445 }
446
447 fn children(&self) -> Vec<&dyn Node> {
448 vec![self.type_node.as_ref().deref()]
449 }
450}
451
452impl Node for ListTypeNode {
453 fn as_any(&self) -> &dyn Any {
454 self
455 }
456
457 fn range(&self) -> Range {
458 self.range.clone()
459 }
460
461 fn children(&self) -> Vec<&dyn Node> {
462 vec![self.type_node.as_ref().deref()]
463 }
464}
465
466impl Node for ConstValueNode {
467 fn as_any(&self) -> &dyn Any {
468 self
469 }
470
471 fn range(&self) -> Range {
472 self.range.clone()
473 }
474
475 fn children(&self) -> Vec<&dyn Node> {
476 Vec::new()
477 }
478}
479
480impl Node for TypedefNode {
481 fn as_any(&self) -> &dyn Any {
482 self
483 }
484
485 fn range(&self) -> Range {
486 self.range.clone()
487 }
488
489 fn children(&self) -> Vec<&dyn Node> {
490 vec![self.definition_type.deref(), &self.identifier as &dyn Node]
491 }
492}
493
494impl Node for EnumNode {
495 fn as_any(&self) -> &dyn Any {
496 self
497 }
498
499 fn range(&self) -> Range {
500 self.range.clone()
501 }
502
503 fn children(&self) -> Vec<&dyn Node> {
504 let mut children = Vec::new();
505 children.push(&self.identifier as &dyn Node);
506 children.extend(self.values.iter().map(|v| v as &dyn Node));
507 children
508 }
509}
510
511impl Node for EnumValueNode {
512 fn as_any(&self) -> &dyn Any {
513 self
514 }
515
516 fn range(&self) -> Range {
517 self.range.clone()
518 }
519
520 fn children(&self) -> Vec<&dyn Node> {
521 let mut children = Vec::new();
522 if let Some(ext) = &self.ext {
523 children.push(ext as &dyn Node);
524 }
525 children
526 }
527}
528
529impl Node for StructNode {
530 fn as_any(&self) -> &dyn Any {
531 self
532 }
533
534 fn range(&self) -> Range {
535 self.range.clone()
536 }
537
538 fn children(&self) -> Vec<&dyn Node> {
539 let mut children = Vec::new();
540 children.push(&self.identifier as &dyn Node);
541 children.extend(self.fields.iter().map(|f| f as &dyn Node));
542 if let Some(ext) = &self.ext {
543 children.push(ext as &dyn Node);
544 }
545 children
546 }
547}
548
549impl Node for FieldNode {
550 fn as_any(&self) -> &dyn Any {
551 self
552 }
553
554 fn range(&self) -> Range {
555 self.range.clone()
556 }
557
558 fn children(&self) -> Vec<&dyn Node> {
559 let mut children = Vec::new();
560 if let Some(field_id) = &self.field_id {
561 children.push(field_id as &dyn Node);
562 }
563 children.push(self.field_type.deref());
564 children.push(&self.identifier as &dyn Node);
565 if let Some(default_value) = &self.default_value {
566 children.push(default_value as &dyn Node);
567 }
568 if let Some(ext) = &self.ext {
569 children.push(ext as &dyn Node);
570 }
571 children
572 }
573}
574
575impl Node for FieldIdNode {
576 fn as_any(&self) -> &dyn Any {
577 self
578 }
579
580 fn range(&self) -> Range {
581 self.range.clone()
582 }
583
584 fn children(&self) -> Vec<&dyn Node> {
585 Vec::new()
586 }
587}
588
589impl Node for UnionNode {
590 fn as_any(&self) -> &dyn Any {
591 self
592 }
593
594 fn range(&self) -> Range {
595 self.range.clone()
596 }
597
598 fn children(&self) -> Vec<&dyn Node> {
599 let mut children = Vec::new();
600 children.push(&self.identifier as &dyn Node);
601 children.extend(self.fields.iter().map(|f| f as &dyn Node));
602 children
603 }
604}
605
606impl Node for ExceptionNode {
607 fn as_any(&self) -> &dyn Any {
608 self
609 }
610
611 fn range(&self) -> Range {
612 self.range.clone()
613 }
614
615 fn children(&self) -> Vec<&dyn Node> {
616 let mut children = Vec::new();
617 children.push(&self.identifier as &dyn Node);
618 children.extend(self.fields.iter().map(|f| f as &dyn Node));
619 children
620 }
621}
622
623impl Node for ServiceNode {
624 fn as_any(&self) -> &dyn Any {
625 self
626 }
627
628 fn range(&self) -> Range {
629 self.range.clone()
630 }
631
632 fn children(&self) -> Vec<&dyn Node> {
633 let mut children = Vec::new();
634 children.push(&self.identifier as &dyn Node);
635 if let Some(extends) = &self.extends {
636 children.push(extends as &dyn Node);
637 }
638 children.extend(self.functions.iter().map(|f| f as &dyn Node));
639 children
640 }
641}
642
643impl Node for FunctionNode {
644 fn as_any(&self) -> &dyn Any {
645 self
646 }
647
648 fn range(&self) -> Range {
649 self.range.clone()
650 }
651
652 fn children(&self) -> Vec<&dyn Node> {
653 let mut children = Vec::new();
654 if let Some(function_type) = &self.function_type {
655 children.push(function_type.deref());
656 }
657 children.push(&self.identifier as &dyn Node);
658 children.extend(self.fields.iter().map(|f| f as &dyn Node));
659 if let Some(throws) = &self.throws {
660 children.extend(throws.iter().map(|f| f as &dyn Node));
661 }
662 if let Some(ext) = &self.ext {
663 children.push(ext as &dyn Node);
664 }
665 children
666 }
667}
668
669impl Node for ExtNode {
670 fn as_any(&self) -> &dyn Any {
671 self
672 }
673
674 fn range(&self) -> Range {
675 self.range.clone()
676 }
677
678 fn children(&self) -> Vec<&dyn Node> {
679 Vec::new()
680 }
681}