Check whether the docblock needs updating.
(
info: &FunctionWithDocblock,
content: &str,
local_classes: &[Arc<ClassInfo>],
class_loader: &dyn Fn(&str) -> Option<Arc<ClassInfo>>,
function_loader: FunctionLoader<'_>,
use_
| 567 | |
| 568 | /// Check whether the docblock needs updating. |
| 569 | fn check_needs_update( |
| 570 | info: &FunctionWithDocblock, |
| 571 | content: &str, |
| 572 | local_classes: &[Arc<ClassInfo>], |
| 573 | class_loader: &dyn Fn(&str) -> Option<Arc<ClassInfo>>, |
| 574 | function_loader: FunctionLoader<'_>, |
| 575 | use_map: &HashMap<String, String>, |
| 576 | file_namespace: &Option<String>, |
| 577 | ) -> bool { |
| 578 | // Build a map of existing doc param names. |
| 579 | let doc_param_names: Vec<&str> = info |
| 580 | .doc_params |
| 581 | .iter() |
| 582 | .map(|p| { |
| 583 | let n = p.name.as_str(); |
| 584 | n.strip_prefix("...").unwrap_or(n) |
| 585 | }) |
| 586 | .collect(); |
| 587 | |
| 588 | let sig_param_names: Vec<String> = info.sig_params.iter().map(|p| p.name.clone()).collect(); |
| 589 | |
| 590 | // When the docblock already has at least one @param tag the user has |
| 591 | // opted-in to documenting parameters, so every signature param is |
| 592 | // relevant. When the docblock has *zero* @param tags we only consider |
| 593 | // params that need enrichment (matching generate-docblock behaviour). |
| 594 | let has_any_doc_params = !doc_param_names.is_empty(); |
| 595 | |
| 596 | if has_any_doc_params { |
| 597 | // Check for missing, extra, or reordered params. |
| 598 | if doc_param_names.len() != sig_param_names.len() { |
| 599 | return true; |
| 600 | } |
| 601 | for (doc_name, sig_name) in doc_param_names.iter().zip(sig_param_names.iter()) { |
| 602 | if *doc_name != sig_name.as_str() { |
| 603 | return true; |
| 604 | } |
| 605 | } |
| 606 | } else { |
| 607 | // No @param tags at all — only flag if a param needs enrichment. |
| 608 | let needs_enrichment = info |
| 609 | .sig_params |
| 610 | .iter() |
| 611 | .any(|sp| enrichment_plain(sp.type_hint.as_ref(), class_loader).is_some()); |
| 612 | if needs_enrichment { |
| 613 | return true; |
| 614 | } |
| 615 | } |
| 616 | |
| 617 | // Check for type contradictions in @param tags. |
| 618 | for sig_param in &info.sig_params { |
| 619 | if let Some(native_type) = &sig_param.type_hint |
| 620 | && let Some(doc_param) = info.doc_params.iter().find(|dp| { |
| 621 | let n = dp.name.as_str(); |
| 622 | let n = n.strip_prefix("...").unwrap_or(n); |
| 623 | n == sig_param.name |
| 624 | }) |
| 625 | && is_type_contradiction(&doc_param.type_parsed, native_type) |
| 626 | { |
no test coverage detected