Skip to content

Commit c0adce9

Browse files
committed
Relax Module lifetimes and defer cloning
1 parent 2a6bd85 commit c0adce9

File tree

1 file changed

+24
-12
lines changed

1 file changed

+24
-12
lines changed

src/modules.rs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,18 @@ impl<'a> Module<'a> {
5454
pub(crate) fn attrs(&self) -> &[ast::Attribute] {
5555
&self.inner_attr
5656
}
57+
58+
pub(crate) fn to_owned(&self) -> Module<'static> {
59+
Module {
60+
ast_mod_kind: self
61+
.ast_mod_kind
62+
.as_ref()
63+
.map(|i| Cow::Owned((**i).clone())),
64+
items: Cow::Owned((&*self.items).clone()),
65+
inner_attr: self.inner_attr.clone(),
66+
span: self.span,
67+
}
68+
}
5769
}
5870

5971
/// Maps each module to the corresponding file.
@@ -172,7 +184,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
172184
&item,
173185
Module::new(
174186
span,
175-
Some(Cow::Owned(sub_mod_kind.clone())),
187+
Some(Cow::Borrowed(sub_mod_kind)),
176188
Cow::Owned(ThinVec::new()),
177189
&[],
178190
),
@@ -185,7 +197,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
185197
/// Visit modules from AST.
186198
fn visit_mod_from_ast(
187199
&mut self,
188-
items: &'ast [rustc_ast::ptr::P<ast::Item>],
200+
items: &[rustc_ast::ptr::P<ast::Item>],
189201
) -> Result<(), ModuleResolutionError> {
190202
for item in items {
191203
if is_cfg_if(item) {
@@ -211,7 +223,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
211223
fn visit_sub_mod(
212224
&mut self,
213225
item: &'c ast::Item,
214-
sub_mod: Module<'ast>,
226+
sub_mod: Module<'_>,
215227
) -> Result<(), ModuleResolutionError> {
216228
let old_directory = self.directory.clone();
217229
let sub_mod_kind = self.peek_sub_mod(item, &sub_mod)?;
@@ -227,7 +239,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
227239
fn peek_sub_mod(
228240
&self,
229241
item: &'c ast::Item,
230-
sub_mod: &Module<'ast>,
242+
sub_mod: &Module<'_>,
231243
) -> Result<Option<SubModKind<'c, 'ast>>, ModuleResolutionError> {
232244
if contains_skip(&item.attrs) {
233245
return Ok(None);
@@ -267,7 +279,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
267279

268280
fn visit_sub_mod_inner(
269281
&mut self,
270-
sub_mod: Module<'ast>,
282+
sub_mod: Module<'_>,
271283
sub_mod_kind: SubModKind<'c, 'ast>,
272284
) -> Result<(), ModuleResolutionError> {
273285
match sub_mod_kind {
@@ -297,7 +309,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
297309

298310
fn visit_sub_mod_after_directory_update(
299311
&mut self,
300-
sub_mod: Module<'ast>,
312+
sub_mod: Module<'_>,
301313
directory: Option<Directory>,
302314
) -> Result<(), ModuleResolutionError> {
303315
if let Some(directory) = directory {
@@ -319,7 +331,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
319331
&self,
320332
mod_name: symbol::Ident,
321333
attrs: &[ast::Attribute],
322-
sub_mod: &Module<'ast>,
334+
sub_mod: &Module<'_>,
323335
) -> Result<Option<SubModKind<'c, 'ast>>, ModuleResolutionError> {
324336
let relative = match self.directory.ownership {
325337
DirectoryOwnership::Owned { relative } => relative,
@@ -373,7 +385,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
373385
return Ok(None);
374386
} else {
375387
if should_insert {
376-
mods_outside_ast.push((file_path, dir_ownership, sub_mod.clone()));
388+
mods_outside_ast.push((file_path, dir_ownership, sub_mod.to_owned()));
377389
}
378390
return Ok(Some(SubModKind::MultiExternal(mods_outside_ast)));
379391
}
@@ -404,7 +416,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
404416
),
405417
));
406418
if should_insert {
407-
mods_outside_ast.push((file_path, dir_ownership, sub_mod.clone()));
419+
mods_outside_ast.push((file_path, dir_ownership, sub_mod.to_owned()));
408420
}
409421
Ok(Some(SubModKind::MultiExternal(mods_outside_ast)))
410422
}
@@ -418,7 +430,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
418430
}),
419431
Err(..) => {
420432
if should_insert {
421-
mods_outside_ast.push((file_path, dir_ownership, sub_mod.clone()));
433+
mods_outside_ast.push((file_path, dir_ownership, sub_mod.to_owned()));
422434
}
423435
Ok(Some(SubModKind::MultiExternal(mods_outside_ast)))
424436
}
@@ -489,7 +501,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
489501
fn find_mods_outside_of_ast(
490502
&self,
491503
attrs: &[ast::Attribute],
492-
sub_mod: &Module<'ast>,
504+
sub_mod: &Module<'_>,
493505
) -> Vec<(PathBuf, DirectoryOwnership, Module<'ast>)> {
494506
// Filter nested path, like `#[cfg_attr(feature = "foo", path = "bar.rs")]`.
495507
let mut path_visitor = visitor::PathVisitor::default();
@@ -510,7 +522,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
510522
result.push((
511523
actual_path,
512524
DirectoryOwnership::Owned { relative: None },
513-
sub_mod.clone(),
525+
sub_mod.to_owned(),
514526
));
515527
continue;
516528
}

0 commit comments

Comments
 (0)