| 86 | } |
| 87 | |
| 88 | pub(crate) fn parse(node: &Node, ctx: &mut ParserContext) -> Result<Symbol> { |
| 89 | assert_eq!(node.kind(), NODE_KIND); |
| 90 | |
| 91 | let mut children = vec![]; |
| 92 | |
| 93 | let mut cursor = QueryCursor::new(); |
| 94 | let function = cursor |
| 95 | .matches(&QUERY, *node, ctx.code.as_bytes()) |
| 96 | .next() |
| 97 | .unwrap(); |
| 98 | |
| 99 | let main_node = node_for_capture("function", function.captures, &QUERY).unwrap(); |
| 100 | let name_node = node_for_capture("function_name", function.captures, &QUERY).unwrap(); |
| 101 | let type_param_node = node_for_capture("function_type_parameters", function.captures, &QUERY); |
| 102 | let parameters_node = node_for_capture("function_parameters", function.captures, &QUERY); |
| 103 | let return_type_node = node_for_capture("function_return_type", function.captures, &QUERY); |
| 104 | |
| 105 | let identifier = name_node.utf8_text(ctx.code.as_bytes()).unwrap().to_owned(); |
| 106 | |
| 107 | ctx.push_scope(); |
| 108 | ctx.push_fqn(&identifier); |
| 109 | |
| 110 | if let Some(type_parameters) = type_param_node { |
| 111 | parse_type_parameters(&type_parameters, &mut children, ctx); |
| 112 | ctx.push_scope(); |
| 113 | } |
| 114 | |
| 115 | if let Some(parameter_nodes) = parameters_node { |
| 116 | parse_parameters(¶meter_nodes, &mut children, ctx)?; |
| 117 | } |
| 118 | |
| 119 | if let Some(type_node) = return_type_node { |
| 120 | parse_return_type(&type_node, &mut children, ctx)?; |
| 121 | } |
| 122 | |
| 123 | let docs = find_docs(&main_node, ctx.code); |
| 124 | |
| 125 | if type_param_node.is_some() { |
| 126 | ctx.pop_scope(); |
| 127 | } |
| 128 | ctx.pop_scope(); |
| 129 | ctx.pop_fqn(); |
| 130 | |
| 131 | Ok(Symbol::in_context( |
| 132 | ctx, |
| 133 | SymbolKind::Function(Function { |
| 134 | identifier, |
| 135 | documentation: docs.map(process_comment), |
| 136 | is_exported: is_exported(&main_node), |
| 137 | children, |
| 138 | }), |
| 139 | Source::for_node(&main_node, ctx), |
| 140 | )) |
| 141 | } |
| 142 | |
| 143 | pub(crate) fn parse_return_type( |
| 144 | node: &Node, |