Skip to content

Commit 70c7ab6

Browse files
committed
Relax Module lifetimes and defer cloning
1 parent 67fb831 commit 70c7ab6

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

src/modules.rs

Lines changed: 22 additions & 16 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.
@@ -150,7 +158,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
150158
for module_item in visitor.mods() {
151159
if let ast::ItemKind::Mod(_, ref sub_mod_kind) = module_item.item.kind {
152160
let items = match sub_mod_kind {
153-
ast::ModKind::Loaded(items, ..) => Cow::Owned(items.clone()),
161+
ast::ModKind::Loaded(items, ..) => Cow::Borrowed(items),
154162
_ => Cow::Owned(ThinVec::new()),
155163
};
156164
self.visit_sub_mod(
@@ -176,7 +184,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
176184

177185
if let ast::ItemKind::Mod(_, ref sub_mod_kind) = item.kind {
178186
let items = match sub_mod_kind {
179-
ast::ModKind::Loaded(items, ..) => Cow::Owned(items.clone()),
187+
ast::ModKind::Loaded(items, ..) => Cow::Borrowed(items),
180188
_ => Cow::Owned(ThinVec::new()),
181189
};
182190
self.visit_sub_mod(&item, Module::new(item.span, items, &[]), false)?;
@@ -188,7 +196,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
188196
/// Visit modules from AST.
189197
fn visit_mod_from_ast(
190198
&mut self,
191-
items: &'ast [rustc_ast::ptr::P<ast::Item>],
199+
items: &[rustc_ast::ptr::P<ast::Item>],
192200
) -> Result<(), ModuleResolutionError> {
193201
for item in items {
194202
if is_cfg_if(item) {
@@ -209,7 +217,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
209217
fn visit_sub_mod(
210218
&mut self,
211219
item: &'c ast::Item,
212-
sub_mod: Module<'ast>,
220+
sub_mod: Module<'_>,
213221
from_ast: bool,
214222
) -> Result<(), ModuleResolutionError> {
215223
let old_directory = self.directory.clone();
@@ -226,7 +234,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
226234
fn peek_sub_mod(
227235
&self,
228236
item: &'c ast::Item,
229-
sub_mod: &Module<'ast>,
237+
sub_mod: &Module<'_>,
230238
) -> Result<Option<SubModKind<'c, 'ast>>, ModuleResolutionError> {
231239
if contains_skip(&item.attrs) {
232240
return Ok(None);
@@ -266,7 +274,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
266274

267275
fn visit_sub_mod_inner(
268276
&mut self,
269-
sub_mod: Module<'ast>,
277+
sub_mod: Module<'_>,
270278
sub_mod_kind: SubModKind<'c, 'ast>,
271279
from_ast: bool,
272280
) -> Result<(), ModuleResolutionError> {
@@ -297,17 +305,15 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
297305

298306
fn visit_sub_mod_after_directory_update(
299307
&mut self,
300-
sub_mod: Module<'ast>,
308+
sub_mod: Module<'_>,
301309
directory: Option<Directory>,
302310
from_ast: bool,
303311
) -> Result<(), ModuleResolutionError> {
304312
if let Some(directory) = directory {
305313
self.directory = directory;
306314
}
307315
if from_ast {
308-
if let Cow::Borrowed(items) = sub_mod.items {
309-
self.visit_mod_from_ast(items)?;
310-
}
316+
self.visit_mod_from_ast(&sub_mod.items)?;
311317
} else {
312318
self.visit_mod_outside_ast(&sub_mod.items)?;
313319
}
@@ -319,7 +325,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
319325
&self,
320326
mod_name: symbol::Ident,
321327
attrs: &[ast::Attribute],
322-
sub_mod: &Module<'ast>,
328+
sub_mod: &Module<'_>,
323329
) -> Result<Option<SubModKind<'c, 'ast>>, ModuleResolutionError> {
324330
let relative = match self.directory.ownership {
325331
DirectoryOwnership::Owned { relative } => relative,
@@ -368,7 +374,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
368374
return Ok(None);
369375
} else {
370376
if should_insert {
371-
mods_outside_ast.push((file_path, dir_ownership, sub_mod.clone()));
377+
mods_outside_ast.push((file_path, dir_ownership, sub_mod.to_owned()));
372378
}
373379
return Ok(Some(SubModKind::MultiExternal(mods_outside_ast)));
374380
}
@@ -389,7 +395,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
389395
Module::new(span, Cow::Owned(items), &attrs),
390396
));
391397
if should_insert {
392-
mods_outside_ast.push((file_path, dir_ownership, sub_mod.clone()));
398+
mods_outside_ast.push((file_path, dir_ownership, sub_mod.to_owned()));
393399
}
394400
Ok(Some(SubModKind::MultiExternal(mods_outside_ast)))
395401
}
@@ -403,7 +409,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
403409
}),
404410
Err(..) => {
405411
if should_insert {
406-
mods_outside_ast.push((file_path, dir_ownership, sub_mod.clone()));
412+
mods_outside_ast.push((file_path, dir_ownership, sub_mod.to_owned()));
407413
}
408414
Ok(Some(SubModKind::MultiExternal(mods_outside_ast)))
409415
}
@@ -474,7 +480,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
474480
fn find_mods_outside_of_ast(
475481
&self,
476482
attrs: &[ast::Attribute],
477-
sub_mod: &Module<'ast>,
483+
sub_mod: &Module<'_>,
478484
) -> Vec<(PathBuf, DirectoryOwnership, Module<'ast>)> {
479485
// Filter nested path, like `#[cfg_attr(feature = "foo", path = "bar.rs")]`.
480486
let mut path_visitor = visitor::PathVisitor::default();
@@ -495,7 +501,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
495501
result.push((
496502
actual_path,
497503
DirectoryOwnership::Owned { relative: None },
498-
sub_mod.clone(),
504+
sub_mod.to_owned(),
499505
));
500506
continue;
501507
}

0 commit comments

Comments
 (0)