Skip to content

Commit 9b3bc7a

Browse files
committed
Remove syntax::config::strip_unconfigured, add syntax::config::features.
1 parent 234d68b commit 9b3bc7a

File tree

3 files changed

+41
-47
lines changed

3 files changed

+41
-47
lines changed

src/librustc_driver/driver.rs

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ pub struct ExpansionResult<'a> {
551551
/// Returns `None` if we're aborting after handling -W help.
552552
pub fn phase_2_configure_and_expand<'a, F>(sess: &Session,
553553
cstore: &CStore,
554-
mut krate: ast::Crate,
554+
krate: ast::Crate,
555555
registry: Option<Registry>,
556556
crate_name: &'a str,
557557
addl_plugins: Option<Vec<String>>,
@@ -562,21 +562,9 @@ pub fn phase_2_configure_and_expand<'a, F>(sess: &Session,
562562
{
563563
let time_passes = sess.time_passes();
564564

565-
// strip before anything else because crate metadata may use #[cfg_attr]
566-
// and so macros can depend on configuration variables, such as
567-
//
568-
// #[macro_use] #[cfg(foo)]
569-
// mod bar { macro_rules! baz!(() => {{}}) }
570-
//
571-
// baz! should not use this definition unless foo is enabled.
572-
573-
krate = time(time_passes, "configuration", || {
574-
let (krate, features) =
575-
syntax::config::strip_unconfigured_items(krate, &sess.parse_sess, sess.opts.test);
576-
// these need to be set "early" so that expansion sees `quote` if enabled.
577-
*sess.features.borrow_mut() = features;
578-
krate
579-
});
565+
let (mut krate, features) = syntax::config::features(krate, &sess.parse_sess, sess.opts.test);
566+
// these need to be set "early" so that expansion sees `quote` if enabled.
567+
*sess.features.borrow_mut() = features;
580568

581569
*sess.crate_types.borrow_mut() = collect_crate_types(sess, &krate.attrs);
582570
*sess.crate_disambiguator.borrow_mut() =

src/libsyntax/config.rs

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
use attr::HasAttrs;
1212
use feature_gate::{emit_feature_err, EXPLAIN_STMT_ATTR_SYNTAX, Features, get_features, GateIssue};
13-
use fold::Folder;
1413
use {fold, attr};
1514
use ast;
1615
use codemap::{Spanned, respan};
@@ -27,6 +26,40 @@ pub struct StripUnconfigured<'a> {
2726
pub features: Option<&'a Features>,
2827
}
2928

29+
// `cfg_attr`-process the crate's attributes and compute the crate's features.
30+
pub fn features(mut krate: ast::Crate, sess: &ParseSess, should_test: bool)
31+
-> (ast::Crate, Features) {
32+
let features;
33+
{
34+
let mut strip_unconfigured = StripUnconfigured {
35+
config: &krate.config.clone(),
36+
should_test: should_test,
37+
sess: sess,
38+
features: None,
39+
};
40+
41+
let unconfigured_attrs = krate.attrs.clone();
42+
let err_count = sess.span_diagnostic.err_count();
43+
if let Some(attrs) = strip_unconfigured.configure(krate.attrs) {
44+
krate.attrs = attrs;
45+
} else { // the entire crate is unconfigured
46+
krate.attrs = Vec::new();
47+
krate.module.items = Vec::new();
48+
return (krate, Features::new());
49+
}
50+
51+
features = get_features(&sess.span_diagnostic, &krate.attrs);
52+
53+
// Avoid reconfiguring malformed `cfg_attr`s
54+
if err_count == sess.span_diagnostic.err_count() {
55+
strip_unconfigured.features = Some(&features);
56+
strip_unconfigured.configure(unconfigured_attrs);
57+
}
58+
}
59+
60+
(krate, features)
61+
}
62+
3063
impl<'a> StripUnconfigured<'a> {
3164
fn configure<T: HasAttrs>(&mut self, node: T) -> Option<T> {
3265
let node = self.process_cfg_attrs(node);
@@ -125,34 +158,6 @@ impl<'a> StripUnconfigured<'a> {
125158
}
126159
}
127160

128-
// Support conditional compilation by transforming the AST, stripping out
129-
// any items that do not belong in the current configuration
130-
pub fn strip_unconfigured_items(mut krate: ast::Crate, sess: &ParseSess, should_test: bool)
131-
-> (ast::Crate, Features) {
132-
let features;
133-
{
134-
let mut strip_unconfigured = StripUnconfigured {
135-
config: &krate.config.clone(),
136-
should_test: should_test,
137-
sess: sess,
138-
features: None,
139-
};
140-
141-
let err_count = sess.span_diagnostic.err_count();
142-
let krate_attrs = strip_unconfigured.configure(krate.attrs.clone()).unwrap_or_default();
143-
features = get_features(&sess.span_diagnostic, &krate_attrs);
144-
if err_count < sess.span_diagnostic.err_count() {
145-
krate.attrs = krate_attrs.clone(); // Avoid reconfiguring malformed `cfg_attr`s
146-
}
147-
148-
strip_unconfigured.features = Some(&features);
149-
krate = strip_unconfigured.fold_crate(krate);
150-
krate.attrs = krate_attrs;
151-
}
152-
153-
(krate, features)
154-
}
155-
156161
impl<'a> fold::Folder for StripUnconfigured<'a> {
157162
fn fold_foreign_mod(&mut self, foreign_mod: ast::ForeignMod) -> ast::ForeignMod {
158163
ast::ForeignMod {

src/libsyntax/ext/expand.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -719,8 +719,9 @@ pub fn expand_crate_with_expander(expander: &mut MacroExpander,
719719
}
720720

721721
let items = SmallVector::many(c.module.items);
722-
expander.load_macros(&items);
723-
c.module.items = items.into();
722+
let configured = items.fold_with(&mut expander.strip_unconfigured());
723+
expander.load_macros(&configured);
724+
c.module.items = configured.into();
724725

725726
let err_count = expander.cx.parse_sess.span_diagnostic.err_count();
726727
let mut ret = expander.fold_crate(c);

0 commit comments

Comments
 (0)