Find the position (line, character) of a class / interface / trait / enum declaration inside the given file content. Searches for patterns like: `class ClassName` `interface ClassName` `trait ClassName` `enum ClassName` `abstract class ClassName` `final class ClassName` `readonly class ClassName` Returns the position of the keyword (`class`, `interface`, etc.) on the matching line. Resolve `self
(
&self,
uri: &str,
content: &str,
position: Position,
ssp_kind: SelfStaticParentKind,
)
| 755 | /// - `self` / `static` → jump to the enclosing class declaration. |
| 756 | /// - `parent` → jump to the parent class declaration (from `extends`). |
| 757 | fn resolve_self_static_parent( |
| 758 | &self, |
| 759 | uri: &str, |
| 760 | content: &str, |
| 761 | position: Position, |
| 762 | ssp_kind: SelfStaticParentKind, |
| 763 | ) -> Option<Location> { |
| 764 | let cursor_offset = position_to_offset(content, position); |
| 765 | |
| 766 | let classes: Vec<std::sync::Arc<ClassInfo>> = self |
| 767 | .uri_classes_index |
| 768 | .read() |
| 769 | .get(uri) |
| 770 | .cloned() |
| 771 | .unwrap_or_default(); |
| 772 | |
| 773 | let current_class = find_class_at_offset(&classes, cursor_offset)?; |
| 774 | |
| 775 | if matches!( |
| 776 | ssp_kind, |
| 777 | SelfStaticParentKind::Self_ | SelfStaticParentKind::Static | SelfStaticParentKind::This |
| 778 | ) { |
| 779 | // Jump to the enclosing class definition in the current file. |
| 780 | if current_class.keyword_offset == 0 { |
| 781 | return None; |
| 782 | } |
| 783 | let target_position = |
| 784 | crate::util::offset_to_position(content, current_class.keyword_offset as usize); |
| 785 | let parsed_uri = Url::parse(uri).ok()?; |
| 786 | return Some(point_location(parsed_uri, target_position)); |
| 787 | } |
| 788 | |
| 789 | // SelfStaticParentKind::Parent |
| 790 | let parent_name = current_class.parent_class.as_ref()?; |
| 791 | |
| 792 | // Try to find the parent class in the current file first. |
| 793 | // Use keyword_offset when available (the parent class is in the |
| 794 | // same file's uri_classes_index entry). |
| 795 | let parent_in_file = classes.iter().find(|c| c.name == *parent_name); |
| 796 | let parent_pos = parent_in_file |
| 797 | .filter(|pc| pc.keyword_offset > 0) |
| 798 | .map(|pc| crate::util::offset_to_position(content, pc.keyword_offset as usize)); |
| 799 | if let Some(pos) = parent_pos { |
| 800 | let parsed_uri = Url::parse(uri).ok()?; |
| 801 | return Some(point_location(parsed_uri, pos)); |
| 802 | } |
| 803 | |
| 804 | // Resolve the parent class name to a FQN using use-map / namespace. |
| 805 | let ctx = self.file_context(uri); |
| 806 | |
| 807 | let fqn = ctx.resolve_name_at(parent_name, cursor_offset); |
| 808 | |
| 809 | // Try fqn_uri_index / uri_classes_index lookup via find_class_file_content. |
| 810 | if let Some((class_uri, class_content)) = self.find_class_file_content(&fqn, uri, content) { |
| 811 | // Use keyword_offset from the uri_classes_index entry for the cross-file class. |
| 812 | let cross_class = self.find_class_in_uri_classes_index(&fqn); |
| 813 | if let Some(ref cc) = cross_class |
| 814 | && cc.keyword_offset > 0 |
no test coverage detected