Skip to content

Commit aca8f9c

Browse files
committed
Make cfg_if DRYer
1 parent 1224f42 commit aca8f9c

File tree

3 files changed

+9
-28
lines changed

3 files changed

+9
-28
lines changed

src/modules.rs

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -151,19 +151,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> {
151151
fn visit_cfg_if(&mut self, item: &ast::Item) -> Result<(), ModuleResolutionError> {
152152
let mut visitor = visitor::CfgIfVisitor::new(self.parse_sess);
153153
visitor.visit_item(item);
154-
for module_item in visitor.mods() {
155-
if let ast::ItemKind::Mod(_, ref sub_mod_kind) = module_item.item.kind {
156-
self.visit_sub_mod(
157-
&module_item.item,
158-
Module::new(
159-
module_item.item.span,
160-
Some(Cow::Owned(sub_mod_kind.clone())),
161-
Cow::Owned(ThinVec::new()),
162-
&[],
163-
),
164-
)?;
165-
}
166-
}
154+
self.visit_mod_outside_ast(&visitor.items)?;
167155
Ok(())
168156
}
169157

src/modules/visitor.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,25 @@
11
use rustc_ast::ast;
2+
use rustc_ast::ptr::P;
23
use rustc_ast::visit::Visitor;
34
use rustc_span::Symbol;
45

56
use crate::attr::MetaVisitor;
67
use crate::parse::macros::cfg_if::parse_cfg_if;
78
use crate::parse::session::ParseSess;
89

9-
pub(crate) struct ModItem {
10-
pub(crate) item: ast::Item,
11-
}
12-
1310
/// Traverse `cfg_if!` macro and fetch modules.
1411
pub(crate) struct CfgIfVisitor<'a> {
1512
parse_sess: &'a ParseSess,
16-
mods: Vec<ModItem>,
13+
pub(crate) items: Vec<P<ast::Item>>,
1714
}
1815

1916
impl<'a> CfgIfVisitor<'a> {
2017
pub(crate) fn new(parse_sess: &'a ParseSess) -> CfgIfVisitor<'a> {
2118
CfgIfVisitor {
22-
mods: vec![],
2319
parse_sess,
20+
items: Vec::new(),
2421
}
2522
}
26-
27-
pub(crate) fn mods(self) -> Vec<ModItem> {
28-
self.mods
29-
}
3023
}
3124

3225
impl<'a, 'ast: 'a> Visitor<'ast> for CfgIfVisitor<'a> {
@@ -63,8 +56,7 @@ impl<'a, 'ast: 'a> CfgIfVisitor<'a> {
6356
};
6457

6558
let items = parse_cfg_if(self.parse_sess, mac)?;
66-
self.mods
67-
.append(&mut items.into_iter().map(|item| ModItem { item }).collect());
59+
self.items.extend(items);
6860

6961
Ok(())
7062
}

src/parse/macros/cfg_if.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::panic::{catch_unwind, AssertUnwindSafe};
22

33
use rustc_ast::ast;
4+
use rustc_ast::ptr::P;
45
use rustc_ast::token::{Delimiter, TokenKind};
56
use rustc_parse::parser::ForceCollect;
67
use rustc_span::symbol::kw;
@@ -11,7 +12,7 @@ use crate::parse::session::ParseSess;
1112
pub(crate) fn parse_cfg_if<'a>(
1213
sess: &'a ParseSess,
1314
mac: &'a ast::MacCall,
14-
) -> Result<Vec<ast::Item>, &'static str> {
15+
) -> Result<Vec<P<ast::Item>>, &'static str> {
1516
match catch_unwind(AssertUnwindSafe(|| parse_cfg_if_inner(sess, mac))) {
1617
Ok(Ok(items)) => Ok(items),
1718
Ok(err @ Err(_)) => err,
@@ -22,7 +23,7 @@ pub(crate) fn parse_cfg_if<'a>(
2223
fn parse_cfg_if_inner<'a>(
2324
sess: &'a ParseSess,
2425
mac: &'a ast::MacCall,
25-
) -> Result<Vec<ast::Item>, &'static str> {
26+
) -> Result<Vec<P<ast::Item>>, &'static str> {
2627
let ts = mac.args.tokens.clone();
2728
let mut parser = build_stream_parser(sess.inner(), ts);
2829

@@ -63,7 +64,7 @@ fn parse_cfg_if_inner<'a>(
6364
&& parser.token.kind != TokenKind::Eof
6465
{
6566
let item = match parser.parse_item(ForceCollect::No) {
66-
Ok(Some(item_ptr)) => item_ptr.into_inner(),
67+
Ok(Some(item_ptr)) => item_ptr,
6768
Ok(None) => continue,
6869
Err(err) => {
6970
err.cancel();

0 commit comments

Comments
 (0)