rust_analyzer_modules/
tree.rs

1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0. If a copy of the MPL was not distributed with this
3// file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
5mod 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    /// Builds a module tree from a crate
32    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}