MCPcopy Create free account
hub / github.com/PHPantom-dev/phpantom_lsp / resolve_self_static_parent

Method resolve_self_static_parent

src/definition/resolve.rs:757–857  ·  view source on GitHub ↗

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,
    )

Source from the content-addressed store, hash-verified

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

Callers 1

resolve_from_symbolMethod · 0.80

Calls 15

find_class_at_offsetFunction · 0.85
offset_to_positionFunction · 0.85
point_locationFunction · 0.85
resolve_class_pathFunction · 0.85
iterMethod · 0.80
filterMethod · 0.80
file_contextMethod · 0.80
resolve_name_atMethod · 0.80
as_strMethod · 0.80
resolve_class_in_fileMethod · 0.80

Tested by

no test coverage detected