Skip to main content

perl_module/import_match/
mod.rs

1//! Single-line module-import match predicates.
2//!
3//! Determine whether a source line should be considered a target for
4//! module-import rename rewrites.
5
6use crate::boundary::contains_standalone_module_token;
7use crate::import::{ModuleImportKind, parse_module_import_head};
8
9/// Return `true` when `line` references `module_name` in an import statement.
10///
11/// Matching behavior:
12/// - `use Module::Name;` and `require Module::Name;` require exact head-token match.
13/// - `use parent ...` and `use base ...` use boundary-aware token matching.
14/// - Non-import lines return `false`.
15#[must_use]
16pub fn line_references_module_import(line: &str, module_name: &str) -> bool {
17    if line.is_empty() || module_name.is_empty() {
18        return false;
19    }
20
21    line.split(';').any(|statement| {
22        let statement = statement.trim();
23        if statement.is_empty() {
24            return false;
25        }
26
27        let Some(parsed) = parse_module_import_head(statement) else {
28            return false;
29        };
30
31        match parsed.kind {
32            ModuleImportKind::Use | ModuleImportKind::Require => parsed.token == module_name,
33            ModuleImportKind::UseParent | ModuleImportKind::UseBase => {
34                contains_standalone_module_token(statement, module_name)
35            }
36        }
37    })
38}