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

Method resolve_see_target

src/hover/mod.rs:363–413  ·  view source on GitHub ↗

Resolve a single `@see` target to a `file://` URI with line fragment. Handles: - `ClassName` → class keyword offset - `ClassName::method()` → method name offset - `ClassName::$property` → property name offset - `ClassName::CONSTANT` → constant name offset

(&self, target: &str, uri: &str, content: &str)

Source from the content-addressed store, hash-verified

361 /// - `ClassName::$property` → property name offset
362 /// - `ClassName::CONSTANT` → constant name offset
363 fn resolve_see_target(&self, target: &str, uri: &str, content: &str) -> Option<String> {
364 // Check for Class::member syntax.
365 if let Some(sep) = target.find("::") {
366 let class_name = &target[..sep];
367 let mut member_part = target[sep + 2..].to_string();
368 // Strip trailing "()" from method references.
369 if member_part.ends_with("()") {
370 member_part.truncate(member_part.len() - 2);
371 }
372 // Strip leading "$" from property references.
373 let member_name = member_part.strip_prefix('$').unwrap_or(&member_part);
374
375 let cls = self.find_or_load_class(class_name)?;
376 let (class_uri, class_content) =
377 self.find_class_file_content(&cls.name, uri, content)?;
378
379 // Find the member's name_offset.
380 let offset = cls
381 .get_method_ci(member_name)
382 .map(|m| m.name_offset)
383 .or_else(|| {
384 cls.properties
385 .iter()
386 .find(|p| p.name == member_name)
387 .map(|p| p.name_offset)
388 })
389 .or_else(|| {
390 cls.constants
391 .iter()
392 .find(|c| c.name == member_name)
393 .map(|c| c.name_offset)
394 })
395 .filter(|&off| off > 0)?;
396
397 let pos = crate::util::offset_to_position(&class_content, offset as usize);
398 let parsed_uri = Url::parse(&class_uri).ok()?;
399 Some(format!("{}#L{}", parsed_uri, pos.line + 1))
400 } else {
401 // Plain class name.
402 let cls = self.find_or_load_class(target)?;
403 let (class_uri, class_content) =
404 self.find_class_file_content(&cls.name, uri, content)?;
405
406 if cls.keyword_offset == 0 {
407 return None;
408 }
409 let pos = crate::util::offset_to_position(&class_content, cls.keyword_offset as usize);
410 let parsed_uri = Url::parse(&class_uri).ok()?;
411 Some(format!("{}#L{}", parsed_uri, pos.line + 1))
412 }
413 }
414
415 /// Search `class` for a member matching `member_name`.
416 ///

Callers 1

resolve_see_refsMethod · 0.80

Calls 8

offset_to_positionFunction · 0.85
find_or_load_classMethod · 0.80
filterMethod · 0.80
get_method_ciMethod · 0.80
iterMethod · 0.80
findMethod · 0.45
mapMethod · 0.45

Tested by

no test coverage detected