diff options
author | uki00a <uki00a@gmail.com> | 2020-06-09 21:12:47 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-09 14:12:47 +0200 |
commit | 2b2d800b43e548e615abef80278d20dda5ae7d42 (patch) | |
tree | 3fadab0dbce29b7ce98f08a43fb3ca0bed2924bb /cli/doc/mod.rs | |
parent | b3e189ee4f97a9d6c5b7a2164d644aa4c7fa4b79 (diff) |
feat(doc): display all overloads in cli details view (#6186)
Diffstat (limited to 'cli/doc/mod.rs')
-rw-r--r-- | cli/doc/mod.rs | 65 |
1 files changed, 36 insertions, 29 deletions
diff --git a/cli/doc/mod.rs b/cli/doc/mod.rs index b0f7cf60a..81cc2f9fb 100644 --- a/cli/doc/mod.rs +++ b/cli/doc/mod.rs @@ -24,43 +24,50 @@ pub use parser::DocParser; #[cfg(test)] mod tests; -pub fn find_node_by_name_recursively( +pub fn find_nodes_by_name_recursively( doc_nodes: Vec<DocNode>, name: String, -) -> Option<DocNode> { +) -> Vec<DocNode> { let mut parts = name.splitn(2, '.'); let name = parts.next(); let leftover = parts.next(); - name?; - let node = find_node_by_name(doc_nodes, name.unwrap().to_string()); - match node { - Some(node) => match node.kind { - DocNodeKind::Namespace => { - if let Some(leftover) = leftover { - find_node_by_name_recursively( - node.namespace_def.unwrap().elements, - leftover.to_string(), - ) - } else { - Some(node) - } - } - _ => { - if leftover.is_none() { - Some(node) - } else { - None - } + if name.is_none() { + return doc_nodes; + } + + let name = name.unwrap(); + let doc_nodes = find_nodes_by_name(doc_nodes, name.to_string()); + + let mut found: Vec<DocNode> = vec![]; + match leftover { + Some(leftover) => { + for node in doc_nodes { + let children = find_children_by_name(node, leftover.to_string()); + found.extend(children); } - }, - _ => None, + found + } + None => doc_nodes, + } +} + +fn find_nodes_by_name(doc_nodes: Vec<DocNode>, name: String) -> Vec<DocNode> { + let mut found: Vec<DocNode> = vec![]; + for node in doc_nodes { + if node.name == name { + found.push(node); + } } + found } -fn find_node_by_name(doc_nodes: Vec<DocNode>, name: String) -> Option<DocNode> { - let node = doc_nodes.iter().find(|node| node.name == name); - match node { - Some(node) => Some(node.clone()), - None => None, +fn find_children_by_name(node: DocNode, name: String) -> Vec<DocNode> { + match node.kind { + DocNodeKind::Namespace => { + let namespace_def = node.namespace_def.unwrap(); + find_nodes_by_name_recursively(namespace_def.elements, name) + } + // TODO(#4516) handle class, interface etc... + _ => vec![], } } |