Resolve a class member (method, property, or constant).
(
&self,
item: &mut CompletionItem,
data: &CompletionItemData,
ctx: &FileContext,
content: &str,
)
| 147 | |
| 148 | /// Resolve a class member (method, property, or constant). |
| 149 | fn resolve_member( |
| 150 | &self, |
| 151 | item: &mut CompletionItem, |
| 152 | data: &CompletionItemData, |
| 153 | ctx: &FileContext, |
| 154 | content: &str, |
| 155 | ) { |
| 156 | let class_loader = self.class_loader(ctx); |
| 157 | |
| 158 | // Collect all class names (primary + extras for union members). |
| 159 | let mut all_class_names = vec![data.class_name.clone()]; |
| 160 | all_class_names.extend(data.extra_class_names.iter().cloned()); |
| 161 | |
| 162 | let member_kind = match data.kind.as_str() { |
| 163 | "method" => MemberKindForOrigin::Method, |
| 164 | "property" => MemberKindForOrigin::Property, |
| 165 | "constant" => MemberKindForOrigin::Constant, |
| 166 | _ => return, |
| 167 | }; |
| 168 | |
| 169 | // Build hover markdown for each class, deduplicating by |
| 170 | // declaring class so that a member inherited from a common |
| 171 | // ancestor is shown only once. |
| 172 | let mut hover_markdowns: Vec<String> = Vec::new(); |
| 173 | let mut seen_declaring: Vec<String> = Vec::new(); |
| 174 | |
| 175 | for class_name in &all_class_names { |
| 176 | let class_info: Option<Arc<ClassInfo>> = class_loader(class_name) |
| 177 | .or_else(|| ctx.classes.iter().find(|c| c.name == *class_name).cloned()); |
| 178 | |
| 179 | let Some(class_info) = class_info else { |
| 180 | continue; |
| 181 | }; |
| 182 | |
| 183 | let merged = crate::virtual_members::resolve_class_fully_cached( |
| 184 | &class_info, |
| 185 | &class_loader, |
| 186 | &self.resolved_class_cache, |
| 187 | ); |
| 188 | |
| 189 | let hover = match data.kind.as_str() { |
| 190 | "method" => { |
| 191 | let method = merged.get_method(&data.member_name); |
| 192 | method.map(|m| { |
| 193 | let declaring = find_declaring_class( |
| 194 | &merged, |
| 195 | &data.member_name, |
| 196 | &member_kind, |
| 197 | &class_loader, |
| 198 | ); |
| 199 | ( |
| 200 | declaring.name.to_string(), |
| 201 | self.hover_for_method(m, &declaring, &class_loader, &data.uri, content), |
| 202 | ) |
| 203 | }) |
| 204 | } |
| 205 | "property" => { |
| 206 | let property = merged |
no test coverage detected