Build hover content for a class/interface/trait/enum.
(&self, cls: &ClassInfo, uri: &str, content: &str)
| 1361 | |
| 1362 | /// Build hover content for a class/interface/trait/enum. |
| 1363 | pub(crate) fn hover_for_class_info(&self, cls: &ClassInfo, uri: &str, content: &str) -> Hover { |
| 1364 | let kind_str = match cls.kind { |
| 1365 | ClassLikeKind::Class => { |
| 1366 | if cls.is_abstract { |
| 1367 | "abstract class" |
| 1368 | } else if cls.is_final { |
| 1369 | "final class" |
| 1370 | } else { |
| 1371 | "class" |
| 1372 | } |
| 1373 | } |
| 1374 | ClassLikeKind::Interface => "interface", |
| 1375 | ClassLikeKind::Trait => "trait", |
| 1376 | ClassLikeKind::Enum => "enum", |
| 1377 | }; |
| 1378 | |
| 1379 | let mut extends_implements = String::new(); |
| 1380 | |
| 1381 | // For interfaces, `parent_class` is the first element of |
| 1382 | // `interfaces` (both come from the same `extends` clause), |
| 1383 | // so skip it to avoid duplicating the name. |
| 1384 | if cls.kind != ClassLikeKind::Interface |
| 1385 | && let Some(ref parent) = cls.parent_class |
| 1386 | { |
| 1387 | extends_implements.push_str(&format!(" extends {}", short_name(parent))); |
| 1388 | } |
| 1389 | |
| 1390 | if !cls.interfaces.is_empty() { |
| 1391 | let keyword = if cls.kind == ClassLikeKind::Interface { |
| 1392 | "extends" |
| 1393 | } else { |
| 1394 | "implements" |
| 1395 | }; |
| 1396 | let short_ifaces: Vec<&str> = cls.interfaces.iter().map(|i| short_name(i)).collect(); |
| 1397 | extends_implements.push_str(&format!(" {} {}", keyword, short_ifaces.join(", "))); |
| 1398 | } |
| 1399 | |
| 1400 | let signature = format!("{} {}{}", kind_str, cls.name, extends_implements); |
| 1401 | let ns_line = namespace_line(cls.file_namespace.as_deref()); |
| 1402 | |
| 1403 | let mut lines = Vec::new(); |
| 1404 | |
| 1405 | if let Some(desc) = extract_docblock_description(cls.class_docblock.as_deref()) { |
| 1406 | lines.push(desc); |
| 1407 | } |
| 1408 | |
| 1409 | if let Some(ref msg) = cls.deprecation_message { |
| 1410 | lines.push(format_deprecation_line(msg)); |
| 1411 | } |
| 1412 | |
| 1413 | for url in &cls.links { |
| 1414 | lines.push(format!("[{}]({})", url, url)); |
| 1415 | } |
| 1416 | |
| 1417 | let resolved_see = self.resolve_see_refs(&cls.see_refs, uri, content); |
| 1418 | format_see_refs(&resolved_see, &cls.links, &mut lines); |
| 1419 | |
| 1420 | // Show template parameters with variance and bounds. |
no test coverage detected