diff options
| author | Dylan DPC <dylan.dpc@gmail.com> | 2020-02-13 21:28:05 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-13 21:28:05 +0100 |
| commit | fc51170af5425853dc28997b39f91755b3c386c4 (patch) | |
| tree | 8095033a92f8671ee08f2766797758520a0886bd /src/librustc_parse | |
| parent | 998daf36b9b71549af6606fac8a30c39c21d9218 (diff) | |
| parent | ec434500157c47143a9b5600a7e34522c49f4e8e (diff) | |
Rollup merge of #69057 - Centril:clean-expand, r=petrochenkov
expand: misc cleanups and simplifications Some work I did while trying to understand expand for the purposes of https://github.com/rust-lang/rust/issues/64197. r? @petrochenkov
Diffstat (limited to 'src/librustc_parse')
| -rw-r--r-- | src/librustc_parse/config.rs | 89 |
1 files changed, 34 insertions, 55 deletions
diff --git a/src/librustc_parse/config.rs b/src/librustc_parse/config.rs index 1c479295af3..ec0d251a3f8 100644 --- a/src/librustc_parse/config.rs +++ b/src/librustc_parse/config.rs @@ -207,30 +207,29 @@ pub fn features( edition: Edition, allow_features: &Option<Vec<String>>, ) -> (ast::Crate, Features) { - let features; - { - let mut strip_unconfigured = StripUnconfigured { sess, features: None }; + let mut strip_unconfigured = StripUnconfigured { sess, features: None }; - let unconfigured_attrs = krate.attrs.clone(); - let err_count = sess.span_diagnostic.err_count(); - if let Some(attrs) = strip_unconfigured.configure(krate.attrs) { - krate.attrs = attrs; - } else { - // the entire crate is unconfigured + let unconfigured_attrs = krate.attrs.clone(); + let diag = &sess.span_diagnostic; + let err_count = diag.err_count(); + let features = match strip_unconfigured.configure(krate.attrs) { + None => { + // The entire crate is unconfigured. krate.attrs = Vec::new(); krate.module.items = Vec::new(); - return (krate, Features::default()); + Features::default() } - - features = get_features(&sess.span_diagnostic, &krate.attrs, edition, allow_features); - - // Avoid reconfiguring malformed `cfg_attr`s - if err_count == sess.span_diagnostic.err_count() { - strip_unconfigured.features = Some(&features); - strip_unconfigured.configure(unconfigured_attrs); + Some(attrs) => { + krate.attrs = attrs; + let features = get_features(diag, &krate.attrs, edition, allow_features); + if err_count == diag.err_count() { + // Avoid reconfiguring malformed `cfg_attr`s. + strip_unconfigured.features = Some(&features); + strip_unconfigured.configure(unconfigured_attrs); + } + features } - } - + }; (krate, features) } @@ -347,7 +346,13 @@ impl<'a> StripUnconfigured<'a> { if !is_cfg(attr) { return true; } - + let meta_item = match validate_attr::parse_meta(self.sess, attr) { + Ok(meta_item) => meta_item, + Err(mut err) => { + err.emit(); + return true; + } + }; let error = |span, msg, suggestion: &str| { let mut err = self.sess.span_diagnostic.struct_span_err(span, msg); if !suggestion.is_empty() { @@ -361,41 +366,15 @@ impl<'a> StripUnconfigured<'a> { err.emit(); true }; - - let meta_item = match validate_attr::parse_meta(self.sess, attr) { - Ok(meta_item) => meta_item, - Err(mut err) => { - err.emit(); - return true; - } - }; - let nested_meta_items = if let Some(nested_meta_items) = meta_item.meta_item_list() { - nested_meta_items - } else { - return error( - meta_item.span, - "`cfg` is not followed by parentheses", - "cfg(/* predicate */)", - ); - }; - - if nested_meta_items.is_empty() { - return error(meta_item.span, "`cfg` predicate is not specified", ""); - } else if nested_meta_items.len() > 1 { - return error( - nested_meta_items.last().unwrap().span(), - "multiple `cfg` predicates are specified", - "", - ); - } - - match nested_meta_items[0].meta_item() { - Some(meta_item) => attr::cfg_matches(meta_item, self.sess, self.features), - None => error( - nested_meta_items[0].span(), - "`cfg` predicate key cannot be a literal", - "", - ), + let span = meta_item.span; + match meta_item.meta_item_list() { + None => error(span, "`cfg` is not followed by parentheses", "cfg(/* predicate */)"), + Some([]) => error(span, "`cfg` predicate is not specified", ""), + Some([_, .., l]) => error(l.span(), "multiple `cfg` predicates are specified", ""), + Some([single]) => match single.meta_item() { + Some(meta_item) => attr::cfg_matches(meta_item, self.sess, self.features), + None => error(single.span(), "`cfg` predicate key cannot be a literal", ""), + }, } }) } |
