diff options
| author | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2016-11-15 08:54:27 +0000 |
|---|---|---|
| committer | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2016-11-20 12:35:57 +0000 |
| commit | 4b9b0d3474ec64133fe797d8fcf8a03c803bac8a (patch) | |
| tree | cb8ea8a759f655a894ed7afb7103ca247491e4c4 /src/libsyntax | |
| parent | a2626410d78c3b4bb9b7072b9ca1ee2ed7ce600f (diff) | |
| download | rust-4b9b0d3474ec64133fe797d8fcf8a03c803bac8a.tar.gz rust-4b9b0d3474ec64133fe797d8fcf8a03c803bac8a.zip | |
Refactor `CrateConfig`.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 33 | ||||
| -rw-r--r-- | src/libsyntax/attr.rs | 14 | ||||
| -rw-r--r-- | src/libsyntax/parse/mod.rs | 3 |
3 files changed, 6 insertions, 44 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 8de843fdcb8..3664cc8e064 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -25,6 +25,7 @@ use print::pprust; use ptr::P; use tokenstream::{TokenTree}; +use std::collections::HashSet; use std::fmt; use std::rc::Rc; use std::u32; @@ -485,7 +486,7 @@ pub struct WhereEqPredicate { /// The set of MetaItems that define the compilation environment of the crate, /// used to drive conditional compilation -pub type CrateConfig = Vec<P<MetaItem>>; +pub type CrateConfig = HashSet<(Name, Option<InternedString>)>; #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] pub struct Crate { @@ -519,7 +520,7 @@ pub type MetaItem = Spanned<MetaItemKind>; /// A compile-time attribute item. /// /// E.g. `#[test]`, `#[derive(..)]` or `#[feature = "foo"]` -#[derive(Clone, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] +#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] pub enum MetaItemKind { /// Word meta item. /// @@ -535,34 +536,6 @@ pub enum MetaItemKind { NameValue(Name, Lit), } -// can't be derived because the MetaItemKind::List requires an unordered comparison -impl PartialEq for MetaItemKind { - fn eq(&self, other: &MetaItemKind) -> bool { - use self::MetaItemKind::*; - match *self { - Word(ref ns) => match *other { - Word(ref no) => (*ns) == (*no), - _ => false - }, - List(ref ns, ref miss) => match *other { - List(ref no, ref miso) => { - ns == no && - miss.iter().all(|mi| { - miso.iter().any(|x| x.node == mi.node) - }) - } - _ => false - }, - NameValue(ref ns, ref vs) => match *other { - NameValue(ref no, ref vo) => { - (*ns) == (*no) && vs.node == vo.node - } - _ => false - }, - } - } -} - /// A Block (`{ .. }`). /// /// E.g. `{ .. }` as in `fn foo() { .. }` diff --git a/src/libsyntax/attr.rs b/src/libsyntax/attr.rs index 220ecf52ae0..f84199fb29e 100644 --- a/src/libsyntax/attr.rs +++ b/src/libsyntax/attr.rs @@ -400,18 +400,6 @@ pub fn mk_sugared_doc_attr(id: AttrId, text: InternedString, lo: BytePos, hi: By } } -/* Searching */ -/// Check if `needle` occurs in `haystack` by a structural -/// comparison. This is slightly subtle, and relies on ignoring the -/// span included in the `==` comparison a plain MetaItem. -pub fn contains(haystack: &[P<MetaItem>], needle: &MetaItem) -> bool { - debug!("attr::contains (name={})", needle.name()); - haystack.iter().any(|item| { - debug!(" testing: {}", item.name()); - item.node == needle.node - }) -} - pub fn list_contains_name(items: &[NestedMetaItem], name: &str) -> bool { debug!("attr::list_contains_name (name={})", name); items.iter().any(|item| { @@ -558,7 +546,7 @@ pub fn cfg_matches(cfg: &ast::MetaItem, sess: &ParseSess, features: Option<&Feat if let (Some(feats), Some(gated_cfg)) = (features, GatedCfg::gate(cfg)) { gated_cfg.check_and_emit(sess, feats); } - contains(&sess.config, cfg) + sess.config.contains(&(cfg.name(), cfg.value_str())) } } } diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs index 12408c7d3c9..7feb745259c 100644 --- a/src/libsyntax/parse/mod.rs +++ b/src/libsyntax/parse/mod.rs @@ -22,6 +22,7 @@ use str::char_at; use tokenstream; use std::cell::RefCell; +use std::collections::HashSet; use std::iter; use std::path::{Path, PathBuf}; use std::rc::Rc; @@ -64,7 +65,7 @@ impl ParseSess { ParseSess { span_diagnostic: handler, unstable_features: UnstableFeatures::from_environment(), - config: Vec::new(), + config: HashSet::new(), included_mod_stack: RefCell::new(vec![]), code_map: code_map } |
