Skip to content

Commit 4ae9dff

Browse files
committed
Clean up macro visiting
1 parent a129548 commit 4ae9dff

File tree

2 files changed

+29
-110
lines changed

2 files changed

+29
-110
lines changed

src/modules.rs

+8-58
Original file line numberDiff line numberDiff line change
@@ -147,29 +147,10 @@ impl<'ast, 'psess, 'c> ModResolver<'ast, 'psess> {
147147
Ok(self.file_map)
148148
}
149149

150-
/// Visit `cfg_if` macro and look for module declarations.
151-
fn visit_cfg_if(&mut self, item: Cow<'ast, ast::Item>) -> Result<(), ModuleResolutionError> {
152-
let mut visitor = visitor::CfgIfVisitor::new(self.psess);
153-
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-
Cow::Owned(ast::AttrVec::new()),
163-
),
164-
)?;
165-
}
166-
}
167-
Ok(())
168-
}
169-
170-
fn visit_cfg_match(&mut self, item: Cow<'ast, ast::Item>) -> Result<(), ModuleResolutionError> {
171-
let mut visitor = visitor::CfgMatchVisitor::new(self.psess);
172-
visitor.visit_item(&item);
150+
/// Visit calls of well known macros and look for module declarations.
151+
fn visit_mac_call(&mut self, mac: &ast::MacCall) -> Result<(), ModuleResolutionError> {
152+
let mut visitor = visitor::KnownMacroVisitor::new(self.psess);
153+
visitor.visit_mac_call(mac);
173154
for module_item in visitor.mods() {
174155
if let ast::ItemKind::Mod(_, ref sub_mod_kind) = module_item.item.kind {
175156
self.visit_sub_mod(
@@ -192,14 +173,8 @@ impl<'ast, 'psess, 'c> ModResolver<'ast, 'psess> {
192173
items: ThinVec<rustc_ast::ptr::P<ast::Item>>,
193174
) -> Result<(), ModuleResolutionError> {
194175
for item in items {
195-
if is_cfg_if(&item) {
196-
self.visit_cfg_if(Cow::Owned(item.into_inner()))?;
197-
continue;
198-
}
199-
200-
if is_cfg_match(&item) {
201-
self.visit_cfg_match(Cow::Owned(item.into_inner()))?;
202-
continue;
176+
if let ast::ItemKind::MacCall(ref mac) = item.kind {
177+
self.visit_mac_call(mac)?;
203178
}
204179

205180
if let ast::ItemKind::Mod(_, ref sub_mod_kind) = item.kind {
@@ -224,12 +199,8 @@ impl<'ast, 'psess, 'c> ModResolver<'ast, 'psess> {
224199
items: &'ast [rustc_ast::ptr::P<ast::Item>],
225200
) -> Result<(), ModuleResolutionError> {
226201
for item in items {
227-
if is_cfg_if(item) {
228-
self.visit_cfg_if(Cow::Borrowed(item))?;
229-
}
230-
231-
if is_cfg_match(item) {
232-
self.visit_cfg_match(Cow::Borrowed(item))?;
202+
if let ast::ItemKind::MacCall(ref mac) = item.kind {
203+
self.visit_mac_call(mac)?;
233204
}
234205

235206
if let ast::ItemKind::Mod(_, ref sub_mod_kind) = item.kind {
@@ -589,24 +560,3 @@ fn path_value(attr: &ast::Attribute) -> Option<Symbol> {
589560
fn find_path_value(attrs: &[ast::Attribute]) -> Option<Symbol> {
590561
attrs.iter().flat_map(path_value).next()
591562
}
592-
593-
fn is_macro_name(mac: &ast::MacCall, name: &str) -> bool {
594-
mac.path
595-
.segments
596-
.last()
597-
.map_or(false, |segment| segment.ident.name == Symbol::intern(name))
598-
}
599-
600-
fn is_cfg_if(item: &ast::Item) -> bool {
601-
match item.kind {
602-
ast::ItemKind::MacCall(ref mac) => is_macro_name(mac, "cfg_if"),
603-
_ => false,
604-
}
605-
}
606-
607-
fn is_cfg_match(item: &ast::Item) -> bool {
608-
match item.kind {
609-
ast::ItemKind::MacCall(ref mac) => is_macro_name(mac, "cfg_match"),
610-
_ => false,
611-
}
612-
}

src/modules/visitor.rs

+21-52
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use rustc_ast::ast;
22
use rustc_ast::visit::Visitor;
3+
use rustc_span::Symbol;
34
use rustc_span::sym;
45
use tracing::debug;
56

6-
use super::is_macro_name;
77
use crate::attr::MetaVisitor;
88
use crate::parse::macros::cfg_if::parse_cfg_if;
99
use crate::parse::macros::cfg_match::parse_cfg_match;
@@ -13,15 +13,15 @@ pub(crate) struct ModItem {
1313
pub(crate) item: ast::Item,
1414
}
1515

16-
/// Traverse `cfg_if!` macro and fetch modules.
17-
pub(crate) struct CfgIfVisitor<'a> {
16+
/// Traverse well-known macro names and fetch modules.
17+
pub(crate) struct KnownMacroVisitor<'a> {
1818
psess: &'a ParseSess,
1919
mods: Vec<ModItem>,
2020
}
2121

22-
impl<'a> CfgIfVisitor<'a> {
23-
pub(crate) fn new(psess: &'a ParseSess) -> CfgIfVisitor<'a> {
24-
CfgIfVisitor {
22+
impl<'a> KnownMacroVisitor<'a> {
23+
pub(crate) fn new(psess: &'a ParseSess) -> KnownMacroVisitor<'a> {
24+
KnownMacroVisitor {
2525
mods: vec![],
2626
psess,
2727
}
@@ -32,7 +32,7 @@ impl<'a> CfgIfVisitor<'a> {
3232
}
3333
}
3434

35-
impl<'a, 'ast: 'a> Visitor<'ast> for CfgIfVisitor<'a> {
35+
impl<'a, 'ast: 'a> Visitor<'ast> for KnownMacroVisitor<'a> {
3636
fn visit_mac_call(&mut self, mac: &'ast ast::MacCall) {
3737
match self.visit_mac_inner(mac) {
3838
Ok(()) => (),
@@ -41,55 +41,24 @@ impl<'a, 'ast: 'a> Visitor<'ast> for CfgIfVisitor<'a> {
4141
}
4242
}
4343

44-
impl<'a, 'ast: 'a> CfgIfVisitor<'a> {
44+
impl<'a, 'ast: 'a> KnownMacroVisitor<'a> {
4545
fn visit_mac_inner(&mut self, mac: &'ast ast::MacCall) -> Result<(), &'static str> {
46-
if !is_macro_name(mac, "cfg_if") {
47-
return Err("Expected cfg_if");
46+
fn is_macro_name(mac: &ast::MacCall, name: &str) -> bool {
47+
mac.path
48+
.segments
49+
.last()
50+
.map_or(false, |segment| segment.ident.name == Symbol::intern(name))
4851
}
4952

50-
let items = parse_cfg_if(self.psess, mac)?;
51-
self.mods
52-
.append(&mut items.into_iter().map(|item| ModItem { item }).collect());
53-
54-
Ok(())
55-
}
56-
}
57-
58-
/// Traverse `cfg_match!` macro and fetch modules.
59-
pub(crate) struct CfgMatchVisitor<'a> {
60-
psess: &'a ParseSess,
61-
mods: Vec<ModItem>,
62-
}
63-
64-
impl<'a> CfgMatchVisitor<'a> {
65-
pub(crate) fn new(psess: &'a ParseSess) -> CfgMatchVisitor<'a> {
66-
CfgMatchVisitor {
67-
mods: vec![],
68-
psess,
69-
}
70-
}
71-
72-
pub(crate) fn mods(self) -> Vec<ModItem> {
73-
self.mods
74-
}
75-
}
76-
77-
impl<'a, 'ast: 'a> Visitor<'ast> for CfgMatchVisitor<'a> {
78-
fn visit_mac_call(&mut self, mac: &'ast ast::MacCall) {
79-
match self.visit_mac_inner(mac) {
80-
Ok(()) => (),
81-
Err(e) => debug!("{}", e),
82-
}
83-
}
84-
}
85-
86-
impl<'a, 'ast: 'a> CfgMatchVisitor<'a> {
87-
fn visit_mac_inner(&mut self, mac: &'ast ast::MacCall) -> Result<(), &'static str> {
88-
if !is_macro_name(mac, "cfg_match") {
89-
return Err("Expected cfg_match");
90-
}
53+
let items = if is_macro_name(mac, "cfg_if") {
54+
parse_cfg_if(&self.psess, mac)?
55+
} else if is_macro_name(mac, "cfg_match") {
56+
parse_cfg_match(&self.psess, mac)?
57+
} else {
58+
// ignore all other macros
59+
vec![]
60+
};
9161

92-
let items = parse_cfg_match(self.psess, mac)?;
9362
self.mods
9463
.append(&mut items.into_iter().map(|item| ModItem { item }).collect());
9564

0 commit comments

Comments
 (0)