rust_analyzer_modules/
tree.rs1mod builder;
6
7pub use self::builder::TreeBuilder;
8use crate::item::Item;
9use ra_ap_hir::{self as hir};
10use ra_ap_ide::{self as ide};
11
12#[derive(Clone, PartialEq, Debug)]
13pub struct Tree<N> {
14 pub node: N,
15 pub subtrees: Vec<Tree<N>>,
16}
17
18impl<N> Tree<N> {
19 pub fn new(node: N, subtrees: Vec<Tree<N>>) -> Self {
20 Self { node, subtrees }
21 }
22
23 pub fn push_subtree(&mut self, subtree: Tree<N>) {
24 self.subtrees.push(subtree);
25 }
26}
27
28pub type ModuleTree = Tree<Item>;
29
30impl ModuleTree {
31 pub fn build(
33 db: &ide::RootDatabase,
34 crate_id: &hir::Crate,
35 _edition: ide::Edition,
36 ) -> anyhow::Result<Self> {
37 let builder = TreeBuilder::new(db, *crate_id);
38 builder.build()
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 #[test]
47 fn test_tree_creation() {
48 let root = 1;
49 let children = vec![
50 Tree::new(2, vec![]),
51 Tree::new(3, vec![Tree::new(4, vec![])]),
52 ];
53 let tree = Tree::new(root, children);
54
55 assert_eq!(tree.node, 1);
56 assert_eq!(tree.subtrees.len(), 2);
57 assert_eq!(tree.subtrees[0].node, 2);
58 assert_eq!(tree.subtrees[1].node, 3);
59 assert_eq!(tree.subtrees[1].subtrees[0].node, 4);
60 }
61
62 #[test]
63 fn test_push_subtree() {
64 let mut tree = Tree::new(1, vec![]);
65 assert_eq!(tree.subtrees.len(), 0);
66
67 tree.push_subtree(Tree::new(2, vec![]));
68 assert_eq!(tree.subtrees.len(), 1);
69 assert_eq!(tree.subtrees[0].node, 2);
70
71 tree.push_subtree(Tree::new(3, vec![]));
72 assert_eq!(tree.subtrees.len(), 2);
73 assert_eq!(tree.subtrees[1].node, 3);
74 }
75
76 #[test]
77 fn test_tree_equality() {
78 let tree1 = Tree::new(1, vec![Tree::new(2, vec![])]);
79 let tree2 = Tree::new(1, vec![Tree::new(2, vec![])]);
80 let tree3 = Tree::new(1, vec![Tree::new(3, vec![])]);
81
82 assert_eq!(tree1, tree2);
83 assert_ne!(tree1, tree3);
84 }
85
86 #[test]
87 fn test_nested_tree_structure() {
88 let leaf = Tree::new(4, vec![]);
89 let branch = Tree::new(3, vec![leaf]);
90 let subtree = Tree::new(2, vec![branch]);
91 let root = Tree::new(1, vec![subtree]);
92
93 assert_eq!(root.node, 1);
94 assert_eq!(root.subtrees[0].node, 2);
95 assert_eq!(root.subtrees[0].subtrees[0].node, 3);
96 assert_eq!(root.subtrees[0].subtrees[0].subtrees[0].node, 4);
97 }
98}