Skip to content

Commit 5775113

Browse files
committed
Relax Module lifetimes and defer cloning
1 parent c367f7e commit 5775113

File tree

1 file changed

+21
-15
lines changed

1 file changed

+21
-15
lines changed

src/modules.rs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ impl<'a> Module<'a> {
5151
pub(crate) fn attrs(&self) -> &[ast::Attribute] {
5252
&self.inner_attr
5353
}
54+
55+
pub(crate) fn to_owned(&self) -> Module<'static> {
56+
Module {
57+
items: Cow::Owned((&*self.items).clone()),
58+
inner_attr: self.inner_attr.clone(),
59+
span: self.span,
60+
}
61+
}
5462
}
5563

5664
/// Maps each module to the corresponding file.
@@ -164,7 +172,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
164172

165173
if let ast::ItemKind::Mod(_, ref sub_mod_kind) = item.kind {
166174
let items = match sub_mod_kind {
167-
ast::ModKind::Loaded(items, ..) => Cow::Owned(items.clone()),
175+
ast::ModKind::Loaded(items, ..) => Cow::Borrowed(items),
168176
_ => Cow::Owned(ThinVec::new()),
169177
};
170178
self.visit_sub_mod(&item, Module::new(item.span, items, &[]), false)?;
@@ -176,7 +184,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
176184
/// Visit modules from AST.
177185
fn visit_mod_from_ast(
178186
&mut self,
179-
items: &'ast [rustc_ast::ptr::P<ast::Item>],
187+
items: &[rustc_ast::ptr::P<ast::Item>],
180188
) -> Result<(), ModuleResolutionError> {
181189
for item in items {
182190
if is_cfg_if(item) {
@@ -197,7 +205,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
197205
fn visit_sub_mod(
198206
&mut self,
199207
item: &'c ast::Item,
200-
sub_mod: Module<'ast>,
208+
sub_mod: Module<'_>,
201209
from_ast: bool,
202210
) -> Result<(), ModuleResolutionError> {
203211
let old_directory = self.directory.clone();
@@ -214,7 +222,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
214222
fn peek_sub_mod(
215223
&self,
216224
item: &'c ast::Item,
217-
sub_mod: &Module<'ast>,
225+
sub_mod: &Module<'_>,
218226
) -> Result<Option<SubModKind<'c, 'ast>>, ModuleResolutionError> {
219227
if contains_skip(&item.attrs) {
220228
return Ok(None);
@@ -254,7 +262,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
254262

255263
fn visit_sub_mod_inner(
256264
&mut self,
257-
sub_mod: Module<'ast>,
265+
sub_mod: Module<'_>,
258266
sub_mod_kind: SubModKind<'c, 'ast>,
259267
from_ast: bool,
260268
) -> Result<(), ModuleResolutionError> {
@@ -285,17 +293,15 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
285293

286294
fn visit_sub_mod_after_directory_update(
287295
&mut self,
288-
sub_mod: Module<'ast>,
296+
sub_mod: Module<'_>,
289297
directory: Option<Directory>,
290298
from_ast: bool,
291299
) -> Result<(), ModuleResolutionError> {
292300
if let Some(directory) = directory {
293301
self.directory = directory;
294302
}
295303
if from_ast {
296-
if let Cow::Borrowed(items) = sub_mod.items {
297-
self.visit_mod_from_ast(items)?;
298-
}
304+
self.visit_mod_from_ast(&sub_mod.items)?;
299305
} else {
300306
self.visit_mod_outside_ast(&sub_mod.items)?;
301307
}
@@ -307,7 +313,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
307313
&self,
308314
mod_name: symbol::Ident,
309315
attrs: &[ast::Attribute],
310-
sub_mod: &Module<'ast>,
316+
sub_mod: &Module<'_>,
311317
) -> Result<Option<SubModKind<'c, 'ast>>, ModuleResolutionError> {
312318
let relative = match self.directory.ownership {
313319
DirectoryOwnership::Owned { relative } => relative,
@@ -356,7 +362,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
356362
return Ok(None);
357363
} else {
358364
if should_insert {
359-
mods_outside_ast.push((file_path, dir_ownership, sub_mod.clone()));
365+
mods_outside_ast.push((file_path, dir_ownership, sub_mod.to_owned()));
360366
}
361367
return Ok(Some(SubModKind::MultiExternal(mods_outside_ast)));
362368
}
@@ -377,7 +383,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
377383
Module::new(span, Cow::Owned(items), &attrs),
378384
));
379385
if should_insert {
380-
mods_outside_ast.push((file_path, dir_ownership, sub_mod.clone()));
386+
mods_outside_ast.push((file_path, dir_ownership, sub_mod.to_owned()));
381387
}
382388
Ok(Some(SubModKind::MultiExternal(mods_outside_ast)))
383389
}
@@ -391,7 +397,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
391397
}),
392398
Err(..) => {
393399
if should_insert {
394-
mods_outside_ast.push((file_path, dir_ownership, sub_mod.clone()));
400+
mods_outside_ast.push((file_path, dir_ownership, sub_mod.to_owned()));
395401
}
396402
Ok(Some(SubModKind::MultiExternal(mods_outside_ast)))
397403
}
@@ -462,7 +468,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
462468
fn find_mods_outside_of_ast(
463469
&self,
464470
attrs: &[ast::Attribute],
465-
sub_mod: &Module<'ast>,
471+
sub_mod: &Module<'_>,
466472
) -> Vec<(PathBuf, DirectoryOwnership, Module<'ast>)> {
467473
// Filter nested path, like `#[cfg_attr(feature = "foo", path = "bar.rs")]`.
468474
let mut path_visitor = visitor::PathVisitor::default();
@@ -483,7 +489,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
483489
result.push((
484490
actual_path,
485491
DirectoryOwnership::Owned { relative: None },
486-
sub_mod.clone(),
492+
sub_mod.to_owned(),
487493
));
488494
continue;
489495
}

0 commit comments

Comments
 (0)