terminology: #[feature] *enables* a feature (instead of "declaring" or "activating" it)
This commit is contained in:
@@ -54,14 +54,13 @@ macro_rules! declare_features {
|
||||
#[derive(Clone, Default, Debug)]
|
||||
pub struct Features {
|
||||
/// `#![feature]` attrs for language features, for error reporting.
|
||||
/// "declared" here means that the feature is actually enabled in the current crate.
|
||||
pub declared_lang_features: Vec<(Symbol, Span, Option<Symbol>)>,
|
||||
pub enabled_lang_features: Vec<(Symbol, Span, Option<Symbol>)>,
|
||||
/// `#![feature]` attrs for non-language (library) features.
|
||||
/// "declared" here means that the feature is actually enabled in the current crate.
|
||||
pub declared_lib_features: Vec<(Symbol, Span)>,
|
||||
/// `declared_lang_features` + `declared_lib_features`.
|
||||
pub declared_features: FxHashSet<Symbol>,
|
||||
/// Active state of individual features (unstable only).
|
||||
pub enabled_lib_features: Vec<(Symbol, Span)>,
|
||||
/// `enabled_lang_features` + `enabled_lib_features`.
|
||||
pub enabled_features: FxHashSet<Symbol>,
|
||||
/// State of individual features (unstable lang features only).
|
||||
/// This is `true` if and only if the corresponding feature is listed in `enabled_lang_features`.
|
||||
$(
|
||||
$(#[doc = $doc])*
|
||||
pub $feature: bool
|
||||
@@ -69,46 +68,34 @@ macro_rules! declare_features {
|
||||
}
|
||||
|
||||
impl Features {
|
||||
pub fn set_declared_lang_feature(
|
||||
pub fn set_enabled_lang_feature(
|
||||
&mut self,
|
||||
symbol: Symbol,
|
||||
span: Span,
|
||||
since: Option<Symbol>
|
||||
) {
|
||||
self.declared_lang_features.push((symbol, span, since));
|
||||
self.declared_features.insert(symbol);
|
||||
self.enabled_lang_features.push((symbol, span, since));
|
||||
self.enabled_features.insert(symbol);
|
||||
}
|
||||
|
||||
pub fn set_declared_lib_feature(&mut self, symbol: Symbol, span: Span) {
|
||||
self.declared_lib_features.push((symbol, span));
|
||||
self.declared_features.insert(symbol);
|
||||
pub fn set_enabled_lib_feature(&mut self, symbol: Symbol, span: Span) {
|
||||
self.enabled_lib_features.push((symbol, span));
|
||||
self.enabled_features.insert(symbol);
|
||||
}
|
||||
|
||||
/// This is intended for hashing the set of active features.
|
||||
/// This is intended for hashing the set of enabled language features.
|
||||
///
|
||||
/// The expectation is that this produces much smaller code than other alternatives.
|
||||
///
|
||||
/// Note that the total feature count is pretty small, so this is not a huge array.
|
||||
#[inline]
|
||||
pub fn all_features(&self) -> [u8; NUM_FEATURES] {
|
||||
pub fn all_lang_features(&self) -> [u8; NUM_FEATURES] {
|
||||
[$(self.$feature as u8),+]
|
||||
}
|
||||
|
||||
/// Is the given feature explicitly declared, i.e. named in a
|
||||
/// `#![feature(...)]` within the code?
|
||||
pub fn declared(&self, feature: Symbol) -> bool {
|
||||
self.declared_features.contains(&feature)
|
||||
}
|
||||
|
||||
/// Is the given feature active (enabled by the user)?
|
||||
///
|
||||
/// Panics if the symbol doesn't correspond to a declared feature.
|
||||
pub fn active(&self, feature: Symbol) -> bool {
|
||||
match feature {
|
||||
$( sym::$feature => self.$feature, )*
|
||||
|
||||
_ => panic!("`{}` was not listed in `declare_features`", feature),
|
||||
}
|
||||
/// Is the given feature enabled (via `#[feature(...)]`)?
|
||||
pub fn enabled(&self, feature: Symbol) -> bool {
|
||||
self.enabled_features.contains(&feature)
|
||||
}
|
||||
|
||||
/// Some features are known to be incomplete and using them is likely to have
|
||||
@@ -119,8 +106,11 @@ macro_rules! declare_features {
|
||||
$(
|
||||
sym::$feature => status_to_enum!($status) == FeatureStatus::Incomplete,
|
||||
)*
|
||||
// Accepted/removed features aren't in this file but are never incomplete.
|
||||
_ if self.declared_features.contains(&feature) => false,
|
||||
_ if self.enabled_features.contains(&feature) => {
|
||||
// Accepted/removed features and library features aren't in this file but
|
||||
// are never incomplete.
|
||||
false
|
||||
}
|
||||
_ => panic!("`{}` was not listed in `declare_features`", feature),
|
||||
}
|
||||
}
|
||||
@@ -132,7 +122,7 @@ macro_rules! declare_features {
|
||||
$(
|
||||
sym::$feature => status_to_enum!($status) == FeatureStatus::Internal,
|
||||
)*
|
||||
_ if self.declared_features.contains(&feature) => {
|
||||
_ if self.enabled_features.contains(&feature) => {
|
||||
// This could be accepted/removed, or a libs feature.
|
||||
// Accepted/removed features aren't in this file but are never internal
|
||||
// (a removed feature might have been internal, but that's now irrelevant).
|
||||
|
||||
Reference in New Issue
Block a user