Initialize a monorepo workspace (no root `composer.json`, but subprojects with their own `composer.json` were discovered). Each subproject is processed through the Composer pipeline (PSR-4, classmap, autoload files, vendor packages). After all subprojects are processed, a gitignore-aware full-scan picks up loose PHP files outside any subproject directory.
(
&self,
root: &std::path::Path,
subprojects: &[(PathBuf, String)],
php_version: crate::types::PhpVersion,
progress_token: Option<&NumberOrString>,
)
| 1636 | /// are processed, a gitignore-aware full-scan picks up loose PHP files |
| 1637 | /// outside any subproject directory. |
| 1638 | async fn init_monorepo( |
| 1639 | &self, |
| 1640 | root: &std::path::Path, |
| 1641 | subprojects: &[(PathBuf, String)], |
| 1642 | php_version: crate::types::PhpVersion, |
| 1643 | progress_token: Option<&NumberOrString>, |
| 1644 | ) { |
| 1645 | // Log the discovered subprojects. |
| 1646 | let sub_list: Vec<String> = subprojects |
| 1647 | .iter() |
| 1648 | .filter_map(|(p, _)| { |
| 1649 | p.strip_prefix(root) |
| 1650 | .ok() |
| 1651 | .map(|r| format!(" {}", r.display())) |
| 1652 | }) |
| 1653 | .collect(); |
| 1654 | self.log( |
| 1655 | MessageType::INFO, |
| 1656 | format!( |
| 1657 | "PHPantom: No root composer.json. Found {} Composer project(s):\n{}", |
| 1658 | subprojects.len(), |
| 1659 | sub_list.join("\n") |
| 1660 | ), |
| 1661 | ) |
| 1662 | .await; |
| 1663 | |
| 1664 | // Collect subproject root paths for the skip set. |
| 1665 | let mut skip_dirs: HashSet<PathBuf> = HashSet::new(); |
| 1666 | let sub_count = subprojects.len(); |
| 1667 | |
| 1668 | for (sub_idx, (sub_root, vendor_dir)) in subprojects.iter().enumerate() { |
| 1669 | // Report per-subproject progress. Reserve 10..80 for the |
| 1670 | // subproject loop, leaving 80..95 for the loose-file scan. |
| 1671 | if let Some(tok) = progress_token { |
| 1672 | let pct = 10 + (sub_idx as u32 * 70) / sub_count.max(1) as u32; |
| 1673 | let label = sub_root |
| 1674 | .strip_prefix(root) |
| 1675 | .unwrap_or(sub_root) |
| 1676 | .display() |
| 1677 | .to_string(); |
| 1678 | self.progress_report( |
| 1679 | tok, |
| 1680 | pct, |
| 1681 | Some(format!( |
| 1682 | "Indexing subproject {} / {}: {}", |
| 1683 | sub_idx + 1, |
| 1684 | sub_count, |
| 1685 | label |
| 1686 | )), |
| 1687 | ) |
| 1688 | .await; |
| 1689 | } |
| 1690 | skip_dirs.insert(sub_root.clone()); |
| 1691 | |
| 1692 | // ── PSR-4 mappings ────────────────────────────────────── |
| 1693 | let (mappings, _) = composer::parse_composer_json(sub_root); |
| 1694 | |
| 1695 | // Resolve base_path values to absolute paths so that |
no test coverage detected