diff options
Diffstat (limited to 'src/libsyntax/sess.rs')
| -rw-r--r-- | src/libsyntax/sess.rs | 69 |
1 files changed, 37 insertions, 32 deletions
diff --git a/src/libsyntax/sess.rs b/src/libsyntax/sess.rs index 30f8c56a056..f677d544bc3 100644 --- a/src/libsyntax/sess.rs +++ b/src/libsyntax/sess.rs @@ -20,38 +20,43 @@ use std::str; /// used and should be feature gated accordingly in `check_crate`. #[derive(Default)] crate struct GatedSpans { - /// Spans collected for gating `let_chains`, e.g. `if a && let b = c {}`. - crate let_chains: Lock<Vec<Span>>, - /// Spans collected for gating `async_closure`, e.g. `async || ..`. - crate async_closure: Lock<Vec<Span>>, - /// Spans collected for gating `yield e?` expressions (`generators` gate). - crate yields: Lock<Vec<Span>>, - /// Spans collected for gating `or_patterns`, e.g. `Some(Foo | Bar)`. - crate or_patterns: Lock<Vec<Span>>, - /// Spans collected for gating `const_extern_fn`, e.g. `const extern fn foo`. - crate const_extern_fn: Lock<Vec<Span>>, - /// Spans collected for gating `trait_alias`, e.g. `trait Foo = Ord + Eq;`. - pub trait_alias: Lock<Vec<Span>>, - /// Spans collected for gating `associated_type_bounds`, e.g. `Iterator<Item: Ord>`. - pub associated_type_bounds: Lock<Vec<Span>>, - /// Spans collected for gating `crate_visibility_modifier`, e.g. `crate fn`. - pub crate_visibility_modifier: Lock<Vec<Span>>, - /// Spans collected for gating `const_generics`, e.g. `const N: usize`. - pub const_generics: Lock<Vec<Span>>, - /// Spans collected for gating `decl_macro`, e.g. `macro m() {}`. - pub decl_macro: Lock<Vec<Span>>, - /// Spans collected for gating `box_patterns`, e.g. `box 0`. - pub box_patterns: Lock<Vec<Span>>, - /// Spans collected for gating `exclusive_range_pattern`, e.g. `0..2`. - pub exclusive_range_pattern: Lock<Vec<Span>>, - /// Spans collected for gating `try_blocks`, e.g. `try { a? + b? }`. - pub try_blocks: Lock<Vec<Span>>, - /// Spans collected for gating `label_break_value`, e.g. `'label: { ... }`. - pub label_break_value: Lock<Vec<Span>>, - /// Spans collected for gating `box_syntax`, e.g. `box $expr`. - pub box_syntax: Lock<Vec<Span>>, - /// Spans collected for gating `type_ascription`, e.g. `42: usize`. - pub type_ascription: Lock<Vec<Span>>, + crate spans: Lock<FxHashMap<Symbol, Vec<Span>>>, +} + +impl GatedSpans { + /// Feature gate the given `span` under the given `feature` + /// which is same `Symbol` used in `active.rs`. + pub fn gate(&self, feature: Symbol, span: Span) { + self.spans + .borrow_mut() + .entry(feature) + .or_default() + .push(span); + } + + /// Ungate the last span under the given `feature`. + /// Panics if the given `span` wasn't the last one. + /// + /// Using this is discouraged unless you have a really good reason to. + pub fn ungate_last(&self, feature: Symbol, span: Span) { + let removed_span = self.spans + .borrow_mut() + .entry(feature) + .or_default() + .pop() + .unwrap(); + debug_assert_eq!(span, removed_span); + } + + /// Is the provided `feature` gate ungated currently? + /// + /// Using this is discouraged unless you have a really good reason to. + pub fn is_ungated(&self, feature: Symbol) -> bool { + self.spans + .borrow() + .get(&feature) + .map_or(true, |spans| spans.is_empty()) + } } /// Info about a parsing session. |
